vb.net - 无法将参数值从字符串转换为 int32
问题描述
cmd1.CommandText = "insert into tblInvoiceDetails (InvoiceNo)values(@InvoiceNo )"
With cmd1.Parameters
.AddWithValue("@InvoiceNo", NumericUpDown1.Value)
cmd1.CommandText = "insert into tblInvoiceDetails (itemno,ItemName,Qt,Price,Total)values(@itemno,@ItemName,@Qt,@Price,@Total)"
'cmd1.Parameters.Add("@InvoiceNo", NumericUpDown1 .Value )
cmd1.Parameters.Add("@itemno", SqlDbType.Int)
cmd1.Parameters.Add("@ItemName", SqlDbType.VarChar)
cmd1.Parameters.Add("@Qt", SqlDbType.Int)
cmd1.Parameters.Add("@Price", SqlDbType.Money)
cmd1.Parameters.Add("@Total", SqlDbType.Money)
For x As Integer = 0 To DataGridView2.RowCount - 1
cmd1.Parameters(0).Value = DataGridView2.Rows(x).Cells(0).Value
cmd1.Parameters(1).Value = DataGridView2.Rows(x).Cells(1).Value
cmd1.Parameters(2).Value = DataGridView2.Rows(x).Cells(2).Value
cmd1.Parameters(3).Value = DataGridView2.Rows(x).Cells(3).Value
cmd1.Parameters(4).Value = DataGridView2.Rows(x).Cells(4).Value
Next
End With
cmd1.ExecuteNonQuery()
cmd1.Parameters.Clear()
解决方案
看起来您正在将 DataGridView 中的多个值插入到数据库中,并且它们都具有相同的 InvoiceNo。
为了更容易看出哪个参数是哪个,您可以通过参数名称来引用它们。
要确保数据类型正确,请使用各种Convert
函数。
您需要对每一行数据执行查询。无需清除参数,只需更改每个参数的值即可。
所以你的代码最终会是这样的:
Dim sql = "INSERT INTO tblInvoiceDetails ([itemno], [ItemName], [Qt], [Price], [Total]) VALUES (@itemno, @ItemName, @Qt, @Price, @Total)"
Using conn As New SqlConnection("your connection string"),
cmd1 As New SqlCommand(sql, conn)
cmd1.Parameters.Add("@InvoiceNo", SqlDbType.Int)
cmd1.Parameters.Add("@itemno", SqlDbType.Int)
'TODO: Use the correct size for the VARCHAR column:
cmd1.Parameters.Add("@ItemName", SqlDbType.VarChar, 128)
cmd1.Parameters.Add("@Qt", SqlDbType.Int)
cmd1.Parameters.Add("@Price", SqlDbType.Money)
cmd1.Parameters.Add("@Total", SqlDbType.Money)
cmd1.Parameters("@InvoiceNo").Value = Convert.ToInt32(NumericUpDown1.Value)
conn.Open()
For x As Integer = 0 To DataGridView2.RowCount - 1
cmd1.Parameters("@itemno").Value = Convert.ToInt32(DataGridView2.Rows(x).Cells(0).Value)
cmd1.Parameters("@ItemName").Value = Convert.ToString(DataGridView2.Rows(x).Cells(1).Value)
cmd1.Parameters("@Qt").Value = Convert.ToInt32(DataGridView2.Rows(x).Cells(2).Value)
cmd1.Parameters("@Price").Value = Convert.ToDecimal(DataGridView2.Rows(x).Cells(3).Value)
cmd1.Parameters("@Total").Value = Convert.ToDecimal(DataGridView2.Rows(x).Cells(4).Value)
cmd1.ExecuteNonQuery()
Next
End Using
Using 语句负责清理 SqlConnection 和 SqlCommand 使用的非托管资源。
当您有一个字符串参数(在这种情况下为@ItemName)时,最好告诉它数据库中列的大小。我猜是 128,但你应该输入实际值。
此外,您确实应该为控件提供有意义的名称,例如“InvoiceNoSelector”而不是“NumericUpDown1”。
推荐阅读
- python - 只有一个表达式的两个 REGEX 操作
- windows - 用于循环启动应用程序的 Windows 批处理脚本
- apache-spark - 如何检查大型镶木地板文件中的列是否已被修改?
- r - 如何制作具有一个“x”值和多个“y”值的ggplot
- swift - 如果单击按钮并满足其他条件,如何切换到第二个场景?
- azure - 单个应用洞察服务可以处理的应用服务数量是否有任何限制?
- css - 水平滚动 div 中动画的卡片间距问题
- go - 将struct转换为YAML文件golang,如何避免yaml输出中的空引号?
- c - 管道(),叉子();执行();我为 `cat | 寻找与 bash 相同的行为。ls`
- python - 使用 Python 和 Snowflake 进行列匹配