首页 > 解决方案 > 无法将参数值从字符串转换为 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()

标签: vb.net

解决方案


看起来您正在将 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”。


推荐阅读