如何将 SQL 服务器中的数据插入到两个不同的表中,同时在 SQL 中具有 ORDER# 主键
How can I insert data in SQL server to two different tables while having a ORDER# primary key in SQL
我想从 VB.net 向 SQL 服务器中的两个不同的 table 插入数据。
我在 SQL 中设置了身份增量,这是订单号的来源。其余数据来自vb.net。另一个问题是,每次我捕获订单时,从订单 table 复制到订单详细信息 table 的所有内容都会导致很多不必要的重复行。
这是我在 VB 中的当前代码:
Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
Dim connection As SqlConnection = New SqlConnection("x")
Dim cmd As New Data.SqlClient.SqlCommand
cmd.CommandText = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal)"
cmd.Parameters.Add("@SubTotal", SqlDbType.VarChar).Value = lbltotal.Text
connection.Open()
cmd.Connection = connection
cmd.ExecuteNonQuery()
connection.Close()
Dim icmd As SqlCommand = New SqlCommand("insert into ordenes_5_details (Orden#) select Orden# from Ordenes_5", connection)
connection.Open()
icmd.ExecuteNonQuery()
connection.Close()
Dim command As New Data.SqlClient.SqlCommand
command.CommandText = "INSERT INTO dbo.Ordenes_5_details (Articulo, Cantidad, Precio) VALUES (@Articulo, @Cantidad, @Precio)"
command.Parameters.Add("@Articulo", SqlDbType.VarChar)
command.Parameters.Add("@Cantidad", SqlDbType.Int)
command.Parameters.Add("@Precio", SqlDbType.Float)
connection.Open()
command.Connection = connection
For i As Integer = 0 To DataGridView1.Rows.Count - 1
command.Parameters(0).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
command.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
command.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)
command.ExecuteNonQuery()
Next
MsgBox("se capturo en ambas tablas")
connection.Close()
End Sub
这些是我在 SQL 服务器中的结果:
订单table。 Orden# 是 table.
中的主键
Orden#
Sub_Total
1015
.28
订单详情table。 Orden# 是外键。
Orden#
Articulo
Cantidad
Precio
1015
NULL
NULL
NULL
NULL
BURRITO
3
6.9
NULL
COOKIE
4
3.96
这就是我要找的:
订单table
Orden#
Sub_Total
1015
.28
订单详情table
Orden#
Articulo
Cantidad
Precio
1015
BURRITO
3
6.9
1015
COOKIE
4
3.96
Order/Order 细节模式在数据库工作中很常见,因此您需要熟悉它。有几种方法可以解决这个问题。我将演示一种方法。
您已经在评论中被警告过,数据库中的货币金额字段应该是小数。
Connection
和 Command
等数据库对象使用非托管代码。为了释放这些资源,这些库的架构师提供了 Dispose
方法。 .Net 提供了 vb.net 和 Using...End Using
块来关闭和处理对象。您可以使用逗号将多个对象合并到一个 Using 块中。
您可以将 CommandText
和 Connection
直接传递给命令的构造函数。我在第一个 Insert 语句中添加了额外的一行。这是和输出参数。我们将参数添加到参数集合中并设置 Direction
。 Command
执行后获取值。
第二个 Insert 现在可以将字段 Oden#
和参数 @OrderID
添加到 VALUES 列表中。我们将 Value
设置为 NewOrderID
,因为每次执行命令时它都是相同的。
因为我添加了一个参数,所以我在 For
循环中更改了 Parameters
的索引。
Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
Dim sql = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal);
Set @ID = SCOPE_IDENTITY();"
Dim NewOrderID As Integer
Using connection As New SqlConnection("x"),
cmd As New SqlCommand(sql, connection)
cmd.Parameters.Add("@SubTotal", SqlDbType.Decimal).Value = CDec(lbltotal.Text)
cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output
connection.Open()
cmd.ExecuteNonQuery()
NewOrderID = CInt(cmd.Parameters("ID").Value)
End Using
sql = "INSERT INTO dbo.Ordenes_5_details (Oden#, Articulo, Cantidad, Precio) VALUES (@OrderID, @Articulo, @Cantidad, @Precio)"
Using cn As New SqlConnection("Your connection string"),
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@OrderId", SqlDbType.Int).Value = NewOrderID
cmd.Parameters.Add("@Articulo", SqlDbType.VarChar)
cmd.Parameters.Add("@Cantidad", SqlDbType.Int)
cmd.Parameters.Add("@Precio", SqlDbType.Decimal)
cn.Open()
For i As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
cmd.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
cmd.Parameters(3).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)
cmd.ExecuteNonQuery()
Next
End Using
MessageBox.Show("se capturo en ambas tablas")
End Sub
我想从 VB.net 向 SQL 服务器中的两个不同的 table 插入数据。 我在 SQL 中设置了身份增量,这是订单号的来源。其余数据来自vb.net。另一个问题是,每次我捕获订单时,从订单 table 复制到订单详细信息 table 的所有内容都会导致很多不必要的重复行。 这是我在 VB 中的当前代码:
Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
Dim connection As SqlConnection = New SqlConnection("x")
Dim cmd As New Data.SqlClient.SqlCommand
cmd.CommandText = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal)"
cmd.Parameters.Add("@SubTotal", SqlDbType.VarChar).Value = lbltotal.Text
connection.Open()
cmd.Connection = connection
cmd.ExecuteNonQuery()
connection.Close()
Dim icmd As SqlCommand = New SqlCommand("insert into ordenes_5_details (Orden#) select Orden# from Ordenes_5", connection)
connection.Open()
icmd.ExecuteNonQuery()
connection.Close()
Dim command As New Data.SqlClient.SqlCommand
command.CommandText = "INSERT INTO dbo.Ordenes_5_details (Articulo, Cantidad, Precio) VALUES (@Articulo, @Cantidad, @Precio)"
command.Parameters.Add("@Articulo", SqlDbType.VarChar)
command.Parameters.Add("@Cantidad", SqlDbType.Int)
command.Parameters.Add("@Precio", SqlDbType.Float)
connection.Open()
command.Connection = connection
For i As Integer = 0 To DataGridView1.Rows.Count - 1
command.Parameters(0).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
command.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
command.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)
command.ExecuteNonQuery()
Next
MsgBox("se capturo en ambas tablas")
connection.Close()
End Sub
这些是我在 SQL 服务器中的结果:
订单table。 Orden# 是 table.
中的主键Orden# | Sub_Total |
---|---|
1015 | .28 |
订单详情table。 Orden# 是外键。
Orden# | Articulo | Cantidad | Precio |
---|---|---|---|
1015 | NULL | NULL | NULL |
NULL | BURRITO | 3 | 6.9 |
NULL | COOKIE | 4 | 3.96 |
这就是我要找的:
订单table
Orden# | Sub_Total |
---|---|
1015 | .28 |
订单详情table
Orden# | Articulo | Cantidad | Precio |
---|---|---|---|
1015 | BURRITO | 3 | 6.9 |
1015 | COOKIE | 4 | 3.96 |
Order/Order 细节模式在数据库工作中很常见,因此您需要熟悉它。有几种方法可以解决这个问题。我将演示一种方法。
您已经在评论中被警告过,数据库中的货币金额字段应该是小数。
Connection
和 Command
等数据库对象使用非托管代码。为了释放这些资源,这些库的架构师提供了 Dispose
方法。 .Net 提供了 vb.net 和 Using...End Using
块来关闭和处理对象。您可以使用逗号将多个对象合并到一个 Using 块中。
您可以将 CommandText
和 Connection
直接传递给命令的构造函数。我在第一个 Insert 语句中添加了额外的一行。这是和输出参数。我们将参数添加到参数集合中并设置 Direction
。 Command
执行后获取值。
第二个 Insert 现在可以将字段 Oden#
和参数 @OrderID
添加到 VALUES 列表中。我们将 Value
设置为 NewOrderID
,因为每次执行命令时它都是相同的。
因为我添加了一个参数,所以我在 For
循环中更改了 Parameters
的索引。
Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
Dim sql = "INSERT INTO [dbo].[Ordenes_5]([Sub_Total]) VALUES (@SubTotal);
Set @ID = SCOPE_IDENTITY();"
Dim NewOrderID As Integer
Using connection As New SqlConnection("x"),
cmd As New SqlCommand(sql, connection)
cmd.Parameters.Add("@SubTotal", SqlDbType.Decimal).Value = CDec(lbltotal.Text)
cmd.Parameters.Add("@ID", SqlDbType.Int).Direction = ParameterDirection.Output
connection.Open()
cmd.ExecuteNonQuery()
NewOrderID = CInt(cmd.Parameters("ID").Value)
End Using
sql = "INSERT INTO dbo.Ordenes_5_details (Oden#, Articulo, Cantidad, Precio) VALUES (@OrderID, @Articulo, @Cantidad, @Precio)"
Using cn As New SqlConnection("Your connection string"),
cmd As New SqlCommand(sql, cn)
cmd.Parameters.Add("@OrderId", SqlDbType.Int).Value = NewOrderID
cmd.Parameters.Add("@Articulo", SqlDbType.VarChar)
cmd.Parameters.Add("@Cantidad", SqlDbType.Int)
cmd.Parameters.Add("@Precio", SqlDbType.Decimal)
cn.Open()
For i As Integer = 0 To DataGridView1.Rows.Count - 1
cmd.Parameters(1).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
cmd.Parameters(2).Value = If(DataGridView1.Rows(i).Cells(1).Value, DBNull.Value)
cmd.Parameters(3).Value = If(DataGridView1.Rows(i).Cells(2).Value, DBNull.Value)
cmd.ExecuteNonQuery()
Next
End Using
MessageBox.Show("se capturo en ambas tablas")
End Sub