2015-01-02 4 views
0

Я пытаюсь выяснить, как обновить выбранную строку в моем DataGridView. Я хотел бы, чтобы моя система распознала существующую строку информации, которую я выбрал из своего datagridview (я установил его для выбора строки в строке) и обновил/отредактировал информацию, изменив их с помощью текстовых полей и списков, которые я использовал для их добавления , Все в моей таблице задано как тип данных текста, кроме идентификатора, который является автоматическим номером. Однако я получаю сообщение об ошибке с кодом, который я использовал ниже. Любая помощь будет оценена! Спасибо :) (я собираюсь дать ссылку на скриншот ошибки, так как я не хватает репутации.) * Новая ошибка, когда я прилагаю раздел с кронштейнами http://i.imgur.com/gs8rVhB.pngОбновление Datagridview?

Imports System.Data.OleDb 

Public Class AdmMain 

Dim con As New OleDbConnection 

Sub fillcombo() 
    strsql = " select yrgr from yearandgrade" 
    Dim acscmd As New OleDb.OleDbCommand 
    acscmd.CommandText = strsql 
    acscmd.Connection = acsconn 
    acsdr = acscmd.ExecuteReader 

    While (acsdr.Read()) 
     cboyr.Items.Add(acsdr("yrgr")) 
    End While 
    acscmd.Dispose() 
    acsdr.Close() 
End Sub 

Sub comb2() 
    strsql = " select sections from sectio" 
    Dim acscmd As New OleDb.OleDbCommand 
    acscmd.CommandText = strsql 
    acscmd.Connection = acsconn 
    acsdr = acscmd.ExecuteReader 

    While (acsdr.Read()) 
     cbosec.Items.Add(acsdr("sections")) 
    End While 
    acscmd.Dispose() 
    acsdr.Close() 
End Sub 

Private Sub LinkLabel1_LinkClicked(sender As System.Object, e As System.Windows.Forms.LinkLabelLinkClickedEventArgs) Handles LinkLabel1.LinkClicked 
    If MessageBox.Show("Are you sure you want to logout?", "Logout", MessageBoxButtons.YesNo, MessageBoxIcon.Question) = Windows.Forms.DialogResult.Yes Then 
     MessageBox.Show("You have successfully logged out of VCM's Library Information System!", "Logout Confirmed") 
     Me.Close() 
     LoginUser.Show() 
    End If 
End Sub 

Private Sub Button2_Click(sender As System.Object, e As System.EventArgs) Handles Button2.Click 
    Me.TxtID.Text = "" 
    Me.txtFName.Text = "" 
    Me.txtMName.Text = "" 
    Me.txtLName.Text = "" 
    Me.cboyr.Text = "" 
    Me.cbosec.Text = "" 
    Me.TxtID.Focus() 
End Sub 

Private Sub AdmMain_Load(sender As System.Object, e As System.EventArgs) Handles MyBase.Load 
    Module1.connect() 
    Me.fillcombo() 
    Me.comb2() 


    con.ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=C:\Thesis\Thesis\Database1.accdb" 

    con.Open() 

    datagridshow() 
End Sub 

Private Sub datagridshow() 
    Dim ds As New DataSet 
    Dim dt As New DataTable 
    ds.Tables.Add(dt) 
    Dim da As New OleDbDataAdapter 

    da = New OleDbDataAdapter("select * from students ", con) 
    da.Fill(dt) 

    DataGridView1.DataSource = dt.DefaultView 

    con.Close() 
End Sub 
Private Sub btnAdd_Click(sender As System.Object, e As System.EventArgs) Handles btnAdd.Click 
    Dim rbdtext As String = cboyr.SelectedItem.ToString 
    Dim uno As String = cbosec.SelectedItem.ToString 

    Try 
     Dim cnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
        "Data Source=C:\Thesis\Thesis\Database1.accdb" 
     Dim sqlquery As String = "INSERT INTO students " & _ 
      "(StudentID, FirstName,MiddleName,LastName,Yr, [Section]) " & _ 
      "VALUES (@studid, @fname,@mname,@lname,@yr, @sec)" 

     ' Use this form to initialize both connection and command to 
     ' avoid forgetting to set the appropriate properties.... 

     Using conn = New System.Data.OleDb.OleDbConnection(cnString) 
      Using cmd = New System.Data.OleDb.OleDbCommand(sqlquery, conn) 

       conn.Open() 
       cmd.Parameters.AddWithValue("@studid", TxtID.Text) 
       cmd.Parameters.AddWithValue("@fname", txtFName.Text) 
       cmd.Parameters.AddWithValue("@mname", txtMName.Text) 
       cmd.Parameters.AddWithValue("@lname", txtLName.Text) 
       cmd.Parameters.AddWithValue("@yr", rbdtext) 
       cmd.Parameters.AddWithValue("@sec", uno) 

       If TxtID.Text = "" Or txtFName.Text = "" Or txtMName.Text = "" Or txtLName.Text = "" Or cboyr.SelectedIndex = -1 Or cbosec.SelectedIndex = -1 Then 
        MessageBox.Show("Please complete the required fields.", "Admin", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
        Return 
       Else 
        Dim rowsInserted = cmd.ExecuteNonQuery() 
        If rowsInserted > 0 Then 
         MessageBox.Show("One record successfully added!", "Added!") 
         datagridshow() 
        Else 
         MessageBox.Show("Failure to add new record!", "Failure!") 
        End If 
       End If 

      End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

Private Sub TxtID_KeyPress(sender As Object, e As System.Windows.Forms.KeyPressEventArgs) Handles TxtID.KeyPress 

    '97 - 122 = Ascii codes for simple letters 
    '65 - 90 = Ascii codes for capital letters 
    '48 - 57 = Ascii codes for numbers 

    If Asc(e.KeyChar) <> 8 Then 
     If Asc(e.KeyChar) < 48 Or Asc(e.KeyChar) > 57 Then 
      e.Handled = True 
     End If 
    End If 

End Sub 

Private Sub btnEdit_Click(sender As System.Object, e As System.EventArgs) Handles btnEdit.Click 
    Dim rbdtext As String = cboyr.SelectedItem.ToString 
    Dim uno As String = cbosec.SelectedItem.ToString 

    Try 
     Dim cnString = "Provider=Microsoft.ACE.OLEDB.12.0;" & _ 
        "Data Source=C:\Thesis\Thesis\Database1.accdb" 
     Dim sqlquery As String = "UPDATE Students SET StudentID = @STUDID, FirstName = @FNAME, MiddleName = @MNAME, LastName= @LNAME, Yr = @YRR, [Section] = @SEC WHERE StudentID = @STUDID, FirstName [email protected], MiddleName = @MNAME, LastName= @LNAME, Yr = @YRR, [Section] = @SEC" 



     ' Use this form to initialize both connection and command to 
     ' avoid forgetting to set the appropriate properties.... 

     Using conn = New System.Data.OleDb.OleDbConnection(cnString) 
      Using cmd = New System.Data.OleDb.OleDbCommand(sqlquery, conn) 

       conn.Open() 
       cmd.Parameters.AddWithValue("@STUDID", TxtID.Text) 
       cmd.Parameters.AddWithValue("@FNAME", txtFName.Text) 
       cmd.Parameters.AddWithValue("@MNAME", txtMName.Text) 
       cmd.Parameters.AddWithValue("@LNAME", txtLName.Text) 
       cmd.Parameters.AddWithValue("@YRR", rbdtext) 
       cmd.Parameters.AddWithValue("@SEC", uno) 

       If TxtID.Text = "" Or txtFName.Text = "" Or txtMName.Text = "" Or txtLName.Text = "" Or cboyr.SelectedIndex = -1 Or cbosec.SelectedIndex = -1 Then 
        MessageBox.Show("Please complete the required fields.", "Admin", MessageBoxButtons.OK, MessageBoxIcon.Exclamation) 
        Return 
       Else 
        Dim rowsInserted = cmd.ExecuteNonQuery() 
        If rowsInserted > 0 Then 
         MessageBox.Show("One record successfully updated!", "Updated!") 
         datagridshow() 
        Else 
         MessageBox.Show("Failure to update new record!", "Failure!") 
        End If 
       End If 

      End Using 
     End Using 
    Catch ex As Exception 
     MsgBox(ex.ToString) 
    End Try 
End Sub 

End Class 
+0

Я уже говорил вам, что SECTION является зарезервированным ключевым словом? – Steve

+0

Я забыл извинения. Я все еще получаю сообщение об ошибке даже с разделом, заключенным в скобки. Http://i.imgur.com/gs8rVhB.png @Steve – Phonseal

ответ

0

синтаксис выражения UPDATE ... WHERE требует условия, которое однозначно идентифицирует запись в UPDATE. Если условие представляет собой выражение, состоящее из более чем одного поля/значения, то эти условия следует объединять с использованием операторов AND или OR, не содержащих запятых.

Обычно условие в предложении WHERE идентифицирует запись для обновления с использованием первичного ключа таблицы (в вашем случае это, кажется, поле StudentID), поэтому вам просто нужно написать

Примечания что если StudentID является PRIMARYKEY, вы не пытаетесь изменить/обновить его, потому что это может привести к несоответствиям в ваших других таблицах базы данных, которые ссылаются (имеют отношение) со столом студентов.

Наконец, поставщик OleDb не распознает параметр по их имени, поставщик ожидает, что каждый переданный параметр находится в том же порядке, в каком h, в текстовом поле команды появляются заполнитель параметров (он использует положение параметра для передачи значения движку базы данных), поэтому вам нужно также изменить порядок, в котором вы установили коллекцию параметров для UPDATE

cmd.Parameters.AddWithValue("@FNAME", txtFName.Text) 
cmd.Parameters.AddWithValue("@MNAME", txtMName.Text) 
cmd.Parameters.AddWithValue("@LNAME", txtLName.Text) 
cmd.Parameters.AddWithValue("@YRR", rbdtext) 
cmd.Parameters.AddWithValue("@SEC", uno) 

cmd.Parameters.AddWithValue("@STUDID", TxtID.Text) 
+0

Он удалил длинный список ошибок. Но это показало, что не удалось обновить запись (которая также находится в коде), я не знаю, что приводит к ее провалу? Это из-за datagrid? – Phonseal

+0

Вы получили сообщение об ошибке через исключение или просто «Не удалось обновить новую запись»? – Steve

+0

Просто не удалось обновить запись. @steve – Phonseal

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