【发布时间】: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。
标签: sql sql-server vb.net