在 VB.net 中使用自动编号将数据插入数据库

Inserting data into database with autonumber in VB.net

我正在尝试将数据插入到数据库中,该数据库使用 MS Access 中的自动编号作为主键。我收到一条错误消息“查询值的数量和目标字段不相同。MS Access 中的数据类型是自动编号(我没有将其包含在 INSERT 语句中)、字符串 (@OrderNo)、字符串 (@Product) 、数字 (@Qty) 和日期 (@TDate)。图片如下:

这是我的代码:

For Each row As DataGridViewRow In DataGridView1.Rows
        Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=Daily Inventory.accdb;"

        Using conn As New OleDbConnection(connString)
            Using cmd As New OleDbCommand("Insert into Table1 Values(@OrderNo, @Product, @Qty, @TDate)", conn)
                cmd.Parameters.AddWithValue("@OrderNo", TxtOrder.Text.ToString)
                cmd.Parameters.AddWithValue("@Product", row.Cells("Product").Value)
                cmd.Parameters.AddWithValue("@Qty", row.Cells("Qty").Value)
                cmd.Parameters.AddWithValue("@TDate", Date.Now.ToString("MM/dd/yyyy"))

                If conn.State = ConnectionState.Open Then
                    conn.Close()
                End If

                conn.Open()
                cmd.ExecuteNonQuery()
                conn.Close()
            End Using
        End Using
    Next

嗯,我想我们在这里处理的是先有鸡还是先有蛋的问题?

我的意思是,网格是如何创建的?

您是如何以及在何处设置网格中的列的?

让我们将数据网格视图放入表单中。放入一个按钮。

我们有这个代码来加载网格:

Private Sub HotelGridEdit_Load(sender As Object, e As EventArgs) Handles Me.Load

    LoadGrid()

End Sub

Sub LoadGrid()

    Using conn As New OleDbConnection(My.Settings.AccessDB)

        Dim strSQL As String =
            "SELECT ID, FirstName, LastName, City, HotelName, Description, Active FROM tblHotelsA 
            ORDER BY HotelName"
        Using cmdSQL As New OleDbCommand(strSQL, conn)

            conn.Open()
            Dim rstData As New DataTable
            rstData.Load(cmdSQL.ExecuteReader)
            DataGridView1.DataSource = rstData

        End Using
    End Using


End Sub

所以,现在我们有了这个:

现在,在上面,我可以四处移动光标 - 进行任何我想要的编辑。

我也可以在底部的空白行中输入以添加新行。

我可以点击左侧的记录选择器,然后按删除键。

现在,要保存我的编辑、添加和删除吗?

我在顶部有一个按钮,这段代码可以执行所有更新、所有添加和所有删除。

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click

    ' save all edits, and new rows, and deletes
    Using conn As New OleDbConnection(My.Settings.AccessDB)

        Dim strSQL As String =
            "SELECT ID, FirstName, LastName, City, HotelName, Description, Active FROM tblHotelsA"
        Using cmdSQL As New OleDbCommand(strSQL, conn)
            conn.Open()
            Dim da As New OleDbDataAdapter(cmdSQL)
            Dim daC As New OleDbCommandBuilder(da)
            da.Update(DataGridView1.DataSource)

        End Using
    End Using
End Sub

所以,代码不多。

事实上,经常使用数据 table 的工作要少得多,因为无论如何您都不必弄乱所有这些参数 - 即使您的数据网格不知何故不是从数据库提供的。但是,如果您从数据库中获取“网格”,那么实际上,您只需添加行 - 然后编写一些代码,使用上述代码将更改发送回数据库。如果您想从空白网格开始 - 不显示前几行,那么只需像这样添加到您的 sql:

SELECT * from tblHotels WHERE ID = 0 Order by Hotelname

使用上面的方法创建一个没有任何行的数据table,但仍然将其绑定到网格,因此再次添加或删除行,您只需编辑和添加它们,然后再次相同我上面的代码将用于保存编辑、删除和添加。

您需要将 sql 更改为“插入表 1 (OrderNo,Product,Qty,TDate) Values(@OrderNo, @Product, @Qty, @TDate)”。

以下代码适合我。

    DataGridView1.AllowUserToAddRows = False
    For Each row As DataGridViewRow In DataGridView1.Rows
        Dim connString As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=...;"
        Using conn As New OleDbConnection(connString)
            Using cmd As New OleDbCommand("Insert into Table1 (OrderNo,Product,Qty,TDate) Values(@OrderNo, @Product, @Qty, @TDate)", conn)
                cmd.Parameters.AddWithValue("@OrderNo", TxtOrder.Text.ToString)
                cmd.Parameters.AddWithValue("@Product", row.Cells("Product").Value)
                cmd.Parameters.AddWithValue("@Qty", row.Cells("Qty").Value)
                cmd.Parameters.AddWithValue("@TDate", Date.Now.ToString("MM/dd/yyyy"))

                If conn.State = ConnectionState.Open Then
                    conn.Close()
                End If

                conn.Open()
                cmd.ExecuteNonQuery()
                conn.Close()
            End Using
        End Using
    Next