Не удалось преобразовать значение параметра из строки в int32 - PullRequest
0 голосов
/ 17 января 2020
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()

1 Ответ

2 голосов
/ 17 января 2020

Похоже, что вы вставляете несколько значений из 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 Statement заботится об очистке неуправляемых ресурсов, используемых SqlConnection и SqlCommand.

Если у вас есть строковый параметр (в данном случае @ItemName), лучше всего указать размер столбца в базе данных. Я угадал 128, но вы должны ввести фактическое значение.

Кроме того, вы действительно должны дать значимым именам элементов управления, например, «InvoiceNoSelector» вместо «NumericUpDown1».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...