2015-11-12 1 views
1

Я написал код, который позволяет мне обновлять значения в datagridview через текстовые поля, однако он не работает. Во время выполнения, когда я нажимаю кнопку обновления, ничего не происходит, даже если не появляется сообщение об ошибке.Обновление datagridview через текстовые поля

вот код:

Private Sub btnUpdate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnUpdate.Click 
    Connection.ConnectionString = "provider= Microsoft.ACE.OLEDB.12.0;Data Source= SRTDB.accdb" 
    Dim connectionString As String = "provider= Microsoft.ACE.OLEDB.12.0;Data Source= SRTDB.accdb" 
    Dim SQLQuery As String = "UPDATE Students SET StudentFirstName = @StudentFirstName, " & _ 
        "StudentSurname = @StudentSurname, StudentPassword= @StudentPassword, StudentGroup = @Studentgroup " & _ 
        "WHERE StudentID = @StudentID" 

    Using Connection = New System.Data.OleDb.OleDbConnection(connectionString) 
     Using cmd = New System.Data.OleDb.OleDbCommand(SQLQuery, Connection) 
      Connection.Open() 
      cmd.Parameters.AddWithValue("@StudentID", txtStudentID.Text) 
      cmd.Parameters.AddWithValue("@StudentFirstName", txtStudentFirstname.Text) 
      cmd.Parameters.AddWithValue("@StudentSurname", txtStudentSurname.Text) 
      cmd.Parameters.AddWithValue("@StudentPassword", txtStudentPassword.Text) 
      cmd.Parameters.AddWithValue("@StudentGroup", cbxStudentGroup.Text) 
      Dim rowsInserted = cmd.ExecuteNonQuery 
      If rowsInserted > 0 Then 
       MessageBox.Show("Record successfully updated!", "Updated!") 
       ShowItems() 
      Else 
       MessageBox.Show("Failure to update new record!", "Failure!") 
      End If 
     End Using 
    End Using 
End Sub 
+1

Что было не так с [предыдущим вопросом] (http://stackoverflow.com/questions/33671326/saving-content -в-а-специфического-ряд-в-а-DataGridView)? И как этот код может быть связан с 'DataGridView'? –

+0

в зависимости от того, какой другой код есть, первая строка может быть проблемой - *, что * объект подключения может быть Nothing, Get right it it - вам это не нужно. В противном случае вы прошли через отладку, чтобы узнать, что происходит? – Plutonix

+0

Еще одна вещь - параметры. OleDB не использует именованные параметры как таковые - вы должны назначить их (AddWithValue) в том порядке, в каком они появляются в SQL. Сначала вы назначаете StudentID, но это последний параметр в SQL – Plutonix

ответ

1

OleDB не использует именованные параметры как именованные параметры - вы должны присвоить значения в точном порядке, что они появляются в SQL. Ваш SQL указывает последний идентификатор StudentID, но вы назначаете его как первый параметр. MSDN предполагает, что вы используете ? заполнители вместо названных.

Это означает, что когда он выполняется, он попытается обновить запись WHERE StudentID = cbxStudentGroup.Text. Поскольку вряд ли будет такой рекорд, он просто оленья кожа обновить что-нибудь и rowsInserted будет 0.

Существует одна вещь в вашем коде, а также несколько советов:

Private Sub btnUpdate_Click... 
    Connection.ConnectionString = "provider= Microsoft.ACE.OLEDB.12.0;..." 
    Dim connectionString As String = "provider= Microsoft.ACE...." 
    Dim SQLQuery As String = "UPDATE Students SET StudentFirstName = @StudentFirstName, " & _ ... 

Это первый Connection объект может быть Nothing время от времени. Поскольку он будет перезаписан тем, который находится в блоке USING, просто избавитесь от него. Вы можете сделать свой SQL легче читать с помощью XML-литералов:

Dim SQLQuery As String = <sql> 
       UPDATE Students 
        SET StudentFirstName = @StudentFirstName, 
         StudentSurname = @StudentSurname, 
         StudentPassword= @StudentPassword, 
         StudentGroup = @Studentgroup 
        WHERE StudentID = @StudentID 
        </sql>.Value 

если добавить Imports System.Data.OleDb в верхней части файла кода, вы можете сократить эти ссылки:

Using Connection = New OleDbConnection(connectionString) 
    Using cmd = New OleDbCommand(SQLQuery, Connection) 
     Connection.Open() 
     '... 

Вероятная проблема заключается в порядок от параметров:

 cmd.Parameters.AddWithValue("@StudentFirstName", txtStudentFirstname.Text) 
     cmd.Parameters.AddWithValue("@StudentSurname", txtStudentSurname.Text) 
     cmd.Parameters.AddWithValue("@StudentPassword", txtStudentPassword.Text) 
     cmd.Parameters.AddWithValue("@StudentGroup", cbxStudentGroup.Text) 
     cmd.Parameters.AddWithValue("@StudentID", txtStudentID.Text) 

Обязательное предупреждение: Пароли никогда не должны храниться как открытый текст, а хешированный.

Смотрите также:
Can we stop using AddWithValue() already?
GetConnection Method, чтобы избежать того, чтобы вставить строку соединения везде

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