【发布时间】:2021-11-07 03:32:17
【问题描述】:
我想从 VB.net 将数据插入到 SQL Server 中的两个不同表中。 我在 SQL 中设置了身份增量,这是 order# 的来源。其余数据来自 vb.net。另一个问题是,每次我捕获订单时,从 Order 表中的所有内容都会复制到 Order Details 表中,这会导致大量不必要的重复行。 这是我目前在 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 Server 中的结果:
订单表。 Orden# 是该表中的 PRIMARY KEY。
| Orden# | Sub_Total |
|---|---|
| 1015 | $11.28 |
订单详情表。 Orden# 是外键。
| Orden# | Articulo | Cantidad | Precio |
|---|---|---|---|
| 1015 | NULL | NULL | NULL |
| NULL | BURRITO | 3 | 6.9 |
| NULL | COOKIE | 4 | 3.96 |
这就是我要找的:
订单表
| Orden# | Sub_Total |
|---|---|
| 1015 | $11.28 |
订单明细表
| Orden# | Articulo | Cantidad | Precio |
|---|---|---|---|
| 1015 | BURRITO | 3 | 6.9 |
| 1015 | COOKIE | 4 | 3.96 |
【问题讨论】:
-
command.Parameters.Add("@Cantidad", SqlDbType.VarChar)你被告知这是个问题;学会正确地参数化。您的第一个 INSERT 根本没有参数化。养成良好的习惯 - 始终如一地编写代码。 -
@SMor 那里我只是为你改变了它,因为我很感激你照顾我们的初学者。
-
@SMor 我一直在尝试使用
SCOPE_IDENTITY(),我收到此错误:“无法将参数值从字符串转换为 Int32。”现在,我的 Order 表中也多了一行。奥登# 1015 |小计 11.28,Orden# 1016 |小计 11.28。如何正确实施? -
另外,您可能希望避免在货币列中使用
float,因为这会导致总计错误,参考:float and real (Transact SQL) 用于浮点数字的近似数字数据类型数据。浮点数据是近似的;因此,并非数据类型范围内的所有值都可以准确表示。
标签: sql sql-server vba vb.net