【问题标题】:How to insert multiple rows from datagridview to SQL database in VB.net?如何在 VB.net 中将 datagridview 中的多行插入 SQL 数据库?
【发布时间】:2018-11-17 03:58:57
【问题描述】:

我创建了一个名为form1.vb的表单。
我有 4 个名为 supidsupnamesupmobilesuploc 的文本框。
我有一个名为 datagridview1 的 DataGridView。
我在 DataGridView 中传输这 4 个 TextBoxes 数据,但是当我尝试在 SQL 数据库中发送 DataGridView 行时,它只发送 1 行。

单击插入按钮时,我希望在 SQL Server 中一次插入多行。
有很多关于C语言的教程,但是没有关于VB.Net的教程。
请在VB.Net 中帮助如何做到这一点。

我的代码:

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click

    If TextBox2.Text = "" Or TextBox3.Text = "" Or TextBox4.Text = "" Then
        MessageBox.Show("PLEASE FILL ALL FIELDS")
    Else
        connection.Open()
        Dim thequery As String = "select*from supplierdata where supmobile = @supmobile"
        Dim cmd1 As SqlCommand = New SqlCommand(thequery, connection)
        cmd1.Parameters.AddWithValue("@supmobile", TextBox3.Text)

        Dim reader As SqlDataReader = cmd1.ExecuteReader()

        If reader.HasRows Then
            MessageBox.Show("MOBILE NO IS ALREADY REGISTERED")
        Else
            reader.Close()
            command = New SqlCommand("INSERT INTO supplierdata VALUES (@supid,@supname,@supmobile,@suploc)", connection)
            Dim i As Integer = 0
            For Each row As DataGridViewRow In DataGridView1.Rows
                command.Parameters.Add("supid", SqlDbType.Int).Value = DataGridView1.Rows(i).Cells(0).value
                command.Parameters.Add("supname", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(1).Value
                command.Parameters.Add("supmobile", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(2).Value
                command.Parameters.Add("suploc", SqlDbType.NChar).Value = DataGridView1.Rows(i).Cells(3).Value

                i = command.ExecuteNonQuery()
            Next

            MessageBox.Show("CUSTOMER REGISTERED SUCCESFULLY")
            connection.Close()
            command.Dispose()
        End If
    End If
End Sub

【问题讨论】:

  • 您好先生,我是新来的,我第一次在这里发帖。如果可以,请指导。
  • 正如我所说,答案已在别处提供。我会在这里说我在那里说的。您应该使用数据适配器和DataTable。在数据适配器上调用 Fill 以填充 DataTable 并将其绑定到网格。保存更改只需在数据适配器上调用Update。当然,你需要先配置它,所以你应该阅读如何做到这一点。我上次提供了this link,你可以在那里学习如何做到这一点。

标签: sql-server vb.net datagridview


【解决方案1】:
  1. 在您的第一个 If 语句中使用 OrElse 而不是 Or。一旦检测到 True,这将停止评估。
  2. 保持本地连接。它们应在最后一刻打开并尽快关闭和处置。一个Using...End Using 块会处理这个问题。
  3. 如果您只需要计数,则只要求计数。不要检索您不使用的数据。不需要DataReader。只需使用ExecuteScalar
  4. 使用参数做得很好!
  5. 在添加参数时,您在 Sql 查询中使用的参数名称必须与您的名称匹配。 (对于只关心参数添加顺序的 Access 而言,情况并非如此。)
  6. 现在是真正的问题Dim i As Integer = 0 然后在 For Each 循环中使用DataGridView1.Rows(i).Cells(0).Value。行始终是第一行,并且它在循环中永远不会改变。这就是为什么“它只发送 1 行”
  7. 您不想在For Each 循环中不断添加参数。
  8. 还有一件事 - 如果 subid 是自动增量列,则不要为该列发送任何数据。

未经测试的代码。我没有你的表格或数据库。

Private Sub OPCode2()
    If TextBox2.Text = "" OrElse TextBox3.Text = "" OrElse TextBox4.Text = "" Then
        MessageBox.Show("PLEASE FILL ALL FIELDS")
        Return
    End If
    Dim count As Integer
    Try
        Using cn As New SqlConnection("Your connection string")
            Dim thequery As String = "select Count(*) from supplierdata where supmobile = @supmobile;"
            Using cmd1 As SqlCommand = New SqlCommand(thequery, cn)
                cmd1.Parameters.AddWithValue("@supmobile", TextBox3.Text)
                cn.Open()
                count = CInt(cmd1.ExecuteScalar())
            End Using
        End Using
    Catch ex As Exception 'You probably want to catch more specific exceptions
        'and handle them separately
        MessageBox.Show(ex.Message)
    End Try
    If count > 0 Then
        MessageBox.Show("MOBILE NO IS ALREADY REGISTERED")
        Return
    End If
    Try
        Using cn As New SqlConnection("Your connection string")
            Using cmd2 As New SqlCommand("INSERT INTO supplierdata (supid,supname,supmobile,suploc)VALUES (@supid,@supname,@supmobile,@suploc)", cn)
                cmd2.Parameters.Add("@supid", SqlDbType.Int)
                cmd2.Parameters.Add("@supname", SqlDbType.NChar)
                cmd2.Parameters.Add("@supmobile", SqlDbType.NChar)
                cmd2.Parameters.Add("@suploc", SqlDbType.NChar)
                cn.Open()
                For Each row As DataGridViewRow In DataGridView1.Rows
                    With cmd2
                        .Parameters("@supid").Value = row.Cells(0).Value
                        .Parameters("@supname").Value = row.Cells(1).Value
                        .Parameters("@supmobile").Value = row.Cells(2).Value
                        .Parameters("@suploc").Value = row.Cells(3).Value
                    End With
                    cmd2.ExecuteNonQuery()
                Next
            End Using 'You probably want to catch more specific exceptions
            'and handle them separately
        End Using
    Catch ex As Exception 'You probably want to catch more specific exceptions
        'and handle them separately
        MessageBox.Show(ex.Message)
    End Try
    MessageBox.Show("CUSTOMER REGISTERED SUCCESFULLY")
End Sub

编辑 如果supid 是自动增量列,则将其从参数中删除。 将插入查询更改为 "INSERT INTO supplierdata (supname,supmobile,suploc)VALUES (@supname,@supmobile,@suploc)" 然后你需要删除这些行 cmd2.Parameters.Add("@supid", SqlDbType.Int).Parameters("@supid").Value = row.Cells(0).Value 仅当 supid 为自动递增(标识列)时才执行此操作

【讨论】:

  • 您好,先生,您的代码工作正常,并且在 sql 数据库中插入所有 datagridview 行。它只是在输入数据之前给出错误“参数查询”(SUPID INT,@SUPNAME NCHAR(4000),@SUPMOBILE NCHAR (4000),@SUPLOC' 期望参数 '@SUPID,未提供。
  • 如果您更正了代码以排除 supid(如果它是自动增量),请查看我的编辑。
  • 我没有在 sql 数据库中为 @supid 设置自动增量。现在我在错误恢复代码之前添加了一行代码,它工作正常而没有出错。
猜你喜欢
  • 1970-01-01
  • 2014-07-09
  • 1970-01-01
  • 2012-10-21
  • 1970-01-01
  • 1970-01-01
  • 2019-08-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多