我有一个包含数据的数据网格。第一列是带进口商的组合框,第二列是进口数量。我希望能够将这些数据保存到数据库,而不管用户的选择如何。
请参阅下面的代码。有人可以帮助我吗?
Dim intReturnValue As Integer = 0
Dim SqlCmd As String = "Update Importer_Balance SET Quantity = Quantity + @Quantity WHERE Importer=@Importer and Product=@product"
Dim ConnObj As SqlConnection = New SqlConnection(clsGlobals.ConnString)
Dim CmdObj As SqlCommand = New SqlCommand(SqlCmd, ConnObj)
For i = 0 To Me.dgvImporter.RowCount - 1
CmdObj.Parameters.AddWithValue("@Importer", Me.dgvImporter.Rows(i).Cells(0).Value)
CmdObj.Parameters.AddWithValue("@Quantity", Me.dgvImporter.Rows(i).Cells(1).Value)
CmdObj.Parameters.AddWithValue("@Product", cboProductName.SelectedValue)
Next
ConnObj.Open()
intReturnValue = CInt(CmdObj.ExecuteNonQuery())
ConnObj.Close()
If intReturnValue > 0 Then
MsgBox("You have successfully updated the product table product.", MsgBoxStyle.Information, "")
ClearForm()
Else
MsgBox("No Record were inserted", MsgBoxStyle.Exclamation, "")
End If
答案 0 :(得分:1)
在循环内部添加参数但不执行命令,仅当您只有一行时才会起作用,如果必须更新多行,则会导致错误。
您继续在每个循环中将相同的参数读取到同一命令。
而是在循环之前和循环内部移动参数声明,只需设置它们的值,然后执行命令。
Dim intReturnValue As Integer = 0
Dim SqlCmd As String = "Update Importer_Balance SET Quantity = Quantity + @Quantity WHERE Importer=@Importer and Product=@product"
Dim ConnObj As SqlConnection = New SqlConnection(clsGlobals.ConnString)
Dim CmdObj As SqlCommand = New SqlCommand(SqlCmd, ConnObj)
CmdObj.Parameters.Add("@Importer", SqlDbType.Int)
CmdObj.Parameters.Add("@Quantity", SqlDbType.Int)
CmdObj.Parameters.Add("@Product", SqlDbType.Int)
ConnObj.Open()
For i = 0 To Me.dgvImporter.RowCount - 1
CmdObj.Parameters("@Importer").Value = Convert.ToInt32(Me.dgvImporter.Rows(i).Cells(0).Value)
CmdObj.Parameters("@Quantity").Value = Convert.ToInt32(Me.dgvImporter.Rows(i).Cells(1).Value)
CmdObj.Parameters("@Product").Value = Convert.ToInt32(cboProductName.SelectedValue)
intReturnValue = CInt(CmdObj.ExecuteNonQuery())
Next
重要说明。 AddWithValue
发现查看传递值的参数的数据类型。这种假设很危险,可能导致错误。最好使用专门的构造函数,您可以在其中定义参数的类型和大小