2014-10-04 2 views
1

У меня есть датадайд с данными. Колонка первая - это поле со списком с импортерами, тогда как столбец второй - импортируемое количество. Я хочу сохранить эти данные в БД независимо от выбора пользователя.Сохранение данных Datagrid в базе данных SQL Server в VB.Net

См. Ниже мое кодовое шоу. Кто-нибудь может мне помочь?

Dim intReturnValue As Integer = 0 

Dim SqlCmd As String = "Update Importer_Balance SET Quantity = Quantity + @Quantity WHERE [email protected] and [email protected]" 

Dim ConnObj As SqlConnection = New SqlConnection(clsGlobals.ConnString) 
Dim CmdObj As SqlCommand = New SqlCommand(SqlCmd, ConnObj) 

For i = 0 To Me.dgvImporter.RowCount - 1 
     CmdObj.Parameters.AddWithValue("@Importer", Me.dgvImporter.Rows(i).Cells(0).Value) 
     CmdObj.Parameters.AddWithValue("@Quantity", Me.dgvImporter.Rows(i).Cells(1).Value) 
     CmdObj.Parameters.AddWithValue("@Product", cboProductName.SelectedValue) 
Next 

ConnObj.Open() 

intReturnValue = CInt(CmdObj.ExecuteNonQuery()) 

ConnObj.Close() 

If intReturnValue > 0 Then 
     MsgBox("You have successfully updated the product table product.", MsgBoxStyle.Information, "") 
     ClearForm() 
Else 
     MsgBox("No Record were inserted", MsgBoxStyle.Exclamation, "") 
End If 

ответ

1

Внутри цикла вы добавляете параметры, но не выполнить команду, это будет работать только если у вас есть только один ряд и приводит к ошибке, если вам необходимо обновить более одной строки.
Вы продолжаете считывать одинаковые параметры в каждом цикле с той же командой.

Вместо этого переместите декларацию параметров перед циклом и внутри цикла просто установите их значения, а затем выполните команду.

Dim intReturnValue As Integer = 0 
Dim SqlCmd As String = "Update Importer_Balance SET Quantity = Quantity + @Quantity WHERE [email protected] and [email protected]" 

Dim ConnObj As SqlConnection = New SqlConnection(clsGlobals.ConnString) 
Dim CmdObj As SqlCommand = New SqlCommand(SqlCmd, ConnObj) 
CmdObj.Parameters.Add("@Importer", SqlDbType.Int) 
CmdObj.Parameters.Add("@Quantity", SqlDbType.Int) 
CmdObj.Parameters.Add("@Product", SqlDbType.Int) 
ConnObj.Open() 

For i = 0 To Me.dgvImporter.RowCount - 1 
    CmdObj.Parameters("@Importer").Value = Convert.ToInt32(Me.dgvImporter.Rows(i).Cells(0).Value) 
    CmdObj.Parameters("@Quantity").Value = Convert.ToInt32(Me.dgvImporter.Rows(i).Cells(1).Value) 
    CmdObj.Parameters("@Product").Value = Convert.ToInt32(cboProductName.SelectedValue) 
    intReturnValue = CInt(CmdObj.ExecuteNonQuery()) 

Next 

Важное примечание.AddWithValue обнаруживает тип данных параметра, смотрящего на пройденное значение. Это предположение опасно и может привести к ошибкам. Лучше использовать специализированный конструктор, где вы можете определить тип и размер параметра

+0

Steve. Спасибо за ответ. Просмотрев мой код и следуя вашим предложениям, я получаю эту ошибку: невозможно лить объект типа «System.Int32» для ввода «System.Data.SqlClient.SqlParameter». –

+0

My bad, missing Значение в последнем параметре – Steve

+0

До вашего ответа я включил весь код в цикл. Полученная ошибка похожа на ту, которую я получаю после выполнения инструкции. Ошибка: параметризованный запрос '(@Importer nvarchar (4000), @ Quantity nvarchar (4000), @ Product int)' ожидает параметр '@Importer', который не был указан. –

Смежные вопросы