如何将整数和十进制数据类型从datagridview保存到VB.NET中的数据库ms访问

时间:2019-03-24 15:35:03

标签: vb.net

我一直在寻找解决我的代码错误的方法,该错误表明数据库声明的数据类型与我的数据库不匹配。我正在将数据网格视图的数据保存到ms Access数据库中,但是它显示了保存PRICEQUANTITY数据时数据不匹配的错误。

我尝试添加参数,它显示错误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()

我只需要将数据保存在数据库中即可。

1 个答案:

答案 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