VB.NET 将 DataGridVIew 内容插入 SQL Server 表
Posted
技术标签:
【中文标题】VB.NET 将 DataGridVIew 内容插入 SQL Server 表【英文标题】:VB.NET Insert DataGridVIew content into SQL Server table 【发布时间】:2021-11-01 06:08:57 【问题描述】:我在将 datagridview 中的数据插入 SQL Server 表时遇到问题
我得到的错误是这样的:
System.Data.SqlClient.SqlException:参数化查询“(@Articulo varchar(8000),@Cantidad varchar(8000),@Precio varchar”需要参数“@Articulo”,但未提供该参数。
我的代码:
Private Sub btnGetTotal_Click(sender As Object, e As EventArgs) Handles btnGetTotal.Click
Dim connection As SqlConnection = New SqlConnection("xxx")
Dim command As SqlCommand = New SqlCommand("INSERT INTO Ordenes_Full (Articulo, Cantidad, Precio) VALUES (@Articulo, @Cantidad, @Precio)")
Dim dataAdapter As New Data.SqlClient.SqlDataAdapter
Dim dataSet As New Data.DataSet
command.Parameters.Add("@Articulo", SqlDbType.VarChar)
command.Parameters.Add("@Cantidad", SqlDbType.VarChar)
command.Parameters.Add("@Precio", SqlDbType.VarChar)
connection.Open()
command.Connection = connection
For i As Integer = 0 To DataGridView1.Rows.Count - 1
command.Parameters(0).Value = DataGridView1.Rows(i).Cells(0).Value
command.Parameters(1).Value = DataGridView1.Rows(i).Cells(1).Value
command.Parameters(2).Value = DataGridView1.Rows(i).Cells(2).Value
command.ExecuteNonQuery()
Next
End Sub
【问题讨论】:
对于空值,您需要DbNull.Value
所以If(DataGridView1.Rows(i).Cells(0).Value, DbNull.Value)
等。我强烈建议您清除此代码并改用SqlBulkCopy
。 dataAdapter
和 dataSet
服务的目的是什么?
DataGridView
是如何填写的。 DataTable
是否用作 DataSource
?
The parameterized query '(@Articulo varchar(8000)
这应该给你一个线索,通常是有问题的。指定参数的长度。他们是 真的 varchar 吗? Cantidad(数量)是数字吗?如果不是,它应该是数字吗?坏习惯很难改掉。
你根本不应该这样循环。您应该首先将DataTable
绑定到网格,然后使用数据适配器通过调用Update
一次性保存数据。您将设置该数据适配器的InsertCommand
并为每个参数设置源列。这将自动处理“空”单元格,因为默认情况下DataTable
将在这些字段中包含DBNull.Value
。
【参考方案1】:
我建议这样做完全不同,正如我在对该问题的评论中所建议的那样。但是,如果您要坚持使用此方法,则必须确保将“空”单元格作为NULL
保存到数据库中。你可以这样做:
command.Parameters(0).Value = If(DataGridView1.Rows(i).Cells(0).Value, DBNull.Value)
这将使用单元格的Value
,除非它是Nothing
,在这种情况下它将使用DBNull.Value
。
DBNull.Value
是 ADO.NET 用来表示数据库 NULL
的东西。它不能只使用 Nothing
的原因是因为 ADO.NET 是在可空值类型之前创建的。如果您使用了Nothing
,例如,应该是Integer
,那么它将被解释为0,而不是NULL
。
【讨论】:
以上是关于VB.NET 将 DataGridVIew 内容插入 SQL Server 表的主要内容,如果未能解决你的问题,请参考以下文章
如何在 VB.NET 中将 DataGridView 导出为 Excel 格式