我一直在寻找解决我的代码错误的方法,该错误表明数据库声明的数据类型与我的数据库不匹配。我正在将数据网格视图的数据保存到ms Access数据库中,但是它显示了保存PRICE
和QUANTITY
数据时数据不匹配的错误。
我尝试添加参数,它显示错误System.NullReferenceException:'对象引用未设置为对象的实例。'
'After comfirm only save in database
Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
If (MessageBox.Show("Comfrim the orders?", "Comfirmation", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = DialogResult.Yes) Then
If OrderDataGridView.Rows.Count > 0 Then
DBConnect = New OleDbConnection
DBConnect.ConnectionString = "Provider=Microsoft.jet.oledb.4.0;data source = ViewOrder.mdb"
For i As Integer = OrderDataGridView.Rows.Count - 1 To 0 Step -1
Dim Query As String
Query = "INSERT INTO ViewOrder.Order (Serve,Table_No, Item_Code, Item_Name, Quantity, Price, Remarks)
VALUES (@Serve, @Table_No, @Item_Code, Item_Name, @Quantity, @Price, @Remarks)"
Dim cmd As New OleDb.OleDbCommand(Query, DBConnect)
cmd.Parameters.Add("@Serve", OleDbType.VarChar).Value = Label8.Text
cmd.Parameters.Add("@Table_No", OleDbType.VarChar).Value = Label10.Text
cmd.Parameters.Add("@Item_Code", OleDbType.VarChar).Value = OrderDataGridView.Rows(i).Cells(0).Value
cmd.Parameters.Add("@Item_Name", OleDbType.VarChar).Value = OrderDataGridView.Rows(i).Cells(1).Value
cmd.Parameters.Add("@Quantity", OleDbType.Integer).Value = OrderDataGridView.Rows(i).Cells(2).Value
cmd.Parameters.Add("@Price", OleDbType.Decimal).Value = OrderDataGridView.Rows(i).Cells(3).Value
cmd.Parameters.Add("@Remarks", OleDbType.VarChar).Value = OrderDataGridView.Rows(i).Cells(4).Value
DBConnect.Open()
Dim Reader As OleDbDataReader
Reader = command.ExecuteReader
DBConnect.Close()
Next
End If
End If
End Sub
但是它仍然显示错误。
这是我当前的代码,其中包含数据不匹配的错误。
Dim Query As String
Query = "INSERT INTO ViewOrder.Order (Serve,Table_No, Item_Code, Item_Name, Quantity, Price, Remarks) VALUES ('" & Label8.Text & "','" & Label10.Text & "','" & OrderDataGridView.Rows(i).Cells(0).Value & "', '" & OrderDataGridView.Rows(i).Cells(1).Value & "','" & OrderDataGridView.Rows(i).Cells(2).Value & "','" & OrderDataGridView.Rows(i).Cells(3).Value & "','" & OrderDataGridView.Rows(i).Cells(4).Value & "')"
Dim Reader As OleDbDataReader
command = New OleDbCommand(Query, DBConnect)
Reader = command.ExecuteReader
DBConnect.Close()
我只需要将数据保存在数据库中即可。
答案 0 :(得分:1)
来自MS Docs
OleDbParameter对象添加到对象的顺序 OleDbParameterCollection必须直接对应于 命令文本中参数的问号占位符。
我喜欢使用参数名称而不是问号。比较容易确定我的订单是否正确。我们将参数添加到循环外部,因为每次迭代都使用相同的参数。我们不想继续添加它们。只有值会更改,但Serve和TableNo不会更改,所有插入都保持相同。
将连接字符串直接传递给连接的构造函数。
Using...End
使用块可确保即使发生错误也可以关闭和处置数据库对象。
您不希望读者插入。阅读器用于返回记录。您需要.ExecuteNonQuery
。
由于我刚刚猜到,您需要检查字段的数据类型。
DataGridView.Rows.Count
为-2,因为从1开始计数减去1从0开始计数。并为计数中所包含的网格底部的空行减去另一个。
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
Dim Query As String = "INSERT INTO ViewOrder.Order (Serve,Table_No, Item_Code, Item_Name, Quantity, Price, Remarks)
Values(@Serve, @TableNo, @ItemCode,@ItemName, @Quantity, @Price, @Remarks);"
Using DBConnect = New OleDbConnection("Provider=Microsoft.jet.oledb.4.0;data source = ViewOrder.mdb")
Using cmd As New OleDbCommand(Query, DBConnect)
cmd.Parameters.Add("@Serve", OleDbType.VarChar).Value = Label8.Text
cmd.Parameters.Add("@TableNo", OleDbType.VarChar).Value = Label10.Text
cmd.Parameters.Add("@ItemCode", OleDbType.VarChar)
cmd.Parameters.Add("@ItemName", OleDbType.VarChar)
cmd.Parameters.Add("@Quantity", OleDbType.Integer)
cmd.Parameters.Add("@Price", OleDbType.Decimal)
cmd.Parameters.Add("@Remarks", OleDbType.VarChar)
DBConnect.Open()
For i As Integer = 0 To DataGridView1.Rows.Count - 2
cmd.Parameters("@ItemCode").Value = OrderDataGridView.Rows(i).Cells(0).Value
cmd.Parameters("@ItemName").Value = OrderDataGridView.Rows(i).Cells(1).Value
cmd.Parameters("@Quantity").Value = CInt(OrderDataGridView.Rows(i).Cells(2).Value)
cmd.Parameters("@Price").Value = CDec(OrderDataGridView.Rows(i).Cells(3).Value)
cmd.Parameters("@Remarks").Value = OrderDataGridView.Rows(i).Cells(4).Value
cmd.ExecuteNonQuery()
Next
End Using
End Using
End Sub