2015-01-02 114 views
0

我想弄清楚如何更新我的DataGridView中選定的行。我希望我的系統能夠識別我從datagridview中選擇的一行現有信息(我將它設置爲全行選擇btw),並通過用我用來添加它們的文本框和組合框來更改它們來更新/編輯信息。我的表中的所有內容都被設置爲文本數據類型,除了ID是自動編號。但是,我在下面使用的代碼中出現錯誤。任何幫助將不勝感激!謝謝:)(我會提供一個鏈接到錯誤的截圖,因爲我沒有足夠的聲譽。) *新的錯誤,當我附上與支架部分 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

它確實刪除了長長的錯誤列表。但它顯示更新記錄失敗(這也在代碼中),我不知道是什麼導致它失敗?是因爲數據網格嗎? – Phonseal

+0

您是否通過例外收到錯誤消息,或者它只是「無法更新新記錄」? – Steve

+0

這只是無法更新記錄。 @steve – Phonseal