2016-04-19 2 views
0

Ich versuche, die Positionsspalte in meiner Access-Datenbank zu aktualisieren, aber das Problem ist, ich habe Probleme, diese Spalte zu aktualisieren, während der Rest der Spalte keine Fehlermeldung ausgeben wird.UPDATE-Anweisung in VB Verbindung zu Access

Die Fehlermeldung: Syntaxfehler in Update-Anweisung, Jetdatenbankengine Microsoft ...

Der Code:

Dim myConnection As OleDbConnection = New OleDbConnection 

Dim ds As New DataSet 
Dim da As OleDbDataAdapter 
Dim MaxRows As Integer 
Dim i As Integer 
Dim sql As String 


Private Sub updateButton_Click(sender As Object, e As EventArgs) Handles updateButton.Click 
    Using myConnection = New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\LecturerDetail.mdb") 

     myConnection.Open() 

     Dim str As String 

     str = "UPDATE lecturer " & _ 
       "SET [empName] = ?,[empId] = ?, [position] =?, [faculty] = ? " & _ 
       " , [degree1] = ?, [degree2] = ?, [degree3] = ?,[degree] = ?, [empType] = ? " & _ 
       " ,[icNo] = ?, [citizenship] = ?, [phoneNo] = ?, [email] = ?,[permitNo] = ? " & _ 
       " , [permitStartDate] = ?, [permitEndDate] = ?, [pStatus] =?, [remark] =? " & _ 
       " WHERE ([empId] = ?) " 

     Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection) 
     cmd.Parameters.AddWithValue("@empName", nameTxt.Text) 
     cmd.Parameters.AddWithValue("@empId", empIdTxt.Text) 
     cmd.Parameters.AddWithValue("@position", positionComboBox.SelectedText) 
     cmd.Parameters.AddWithValue("@faculty", facultyComboBox.SelectedText) 
     cmd.Parameters.AddWithValue("@degree1", empDeg1.Text) 
     cmd.Parameters.AddWithValue("@degree2", empDeg2.Text) 
     cmd.Parameters.AddWithValue("@degree3", empDeg3.Text) 
     cmd.Parameters.AddWithValue("@degree", empDeg4.Text) 
     cmd.Parameters.AddWithValue("@empType", empTypeComboBox.SelectedText) 
     cmd.Parameters.AddWithValue("@icNo", icTxt.Text) 
     cmd.Parameters.AddWithValue("@citizenship", citizenshipComboBox.SelectedText) 
     cmd.Parameters.AddWithValue("@phoneNo", phoneTxt.Text) 
     cmd.Parameters.AddWithValue("@email", emailTxt.Text) 
     cmd.Parameters.AddWithValue("@permitNo", permitNoTxt.Text) 
     cmd.Parameters.AddWithValue("@permitStartDate", DateTimePicker1.Text) 
     cmd.Parameters.AddWithValue("@permitEndDate", DateTimePicker2.Text) 
     cmd.Parameters.AddWithValue("@pStatus", statusComboBox.Text) 
     cmd.Parameters.AddWithValue("@remark", remark.Text) 
     cmd.Parameters.AddWithValue("@empId", empIdTxt.Text) 

     Try 
      cmd.ExecuteNonQuery() 
      Dim cb As New OleDb.OleDbCommandBuilder(da) 
      ds.Tables("lecturer").Rows(i).Item(0) = empIdTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(1) = nameTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(2) = positionComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(3) = facultyComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(4) = empDeg1.Text 
      ds.Tables("lecturer").Rows(i).Item(5) = empDeg2.Text 
      ds.Tables("lecturer").Rows(i).Item(6) = empDeg3.Text 
      ds.Tables("lecturer").Rows(i).Item(7) = empDeg4.Text 
      ds.Tables("lecturer").Rows(i).Item(8) = empTypeComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(9) = icTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(10) = citizenshipComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(11) = phoneTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(12) = emailTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(13) = permitNoTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(14) = DateTimePicker1.Value 
      ds.Tables("lecturer").Rows(i).Item(15) = DateTimePicker2.Value 
      ds.Tables("lecturer").Rows(i).Item(16) = statusComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(17) = remark.Text 

      da.Update(ds, "lecturer") 
      ds.AcceptChanges() 
      myConnection.Close() 
      MsgBox("Record Updated") 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & "-" & ex.Source) 
     End Try 
    End Using 
End Sub 

Mein Code ist die Spalten zu aktualisieren, und erlaubt dem Anwender, zu Navigieren Sie zum nächsten Datensatz.

Ich bin neu in Visual Basic, so dass Detailbeschreibung und Anleitung geschätzt werden. Vielen Dank. Außerdem versuche ich, ein automatisches Benachrichtigungssystem basierend auf den Daten zu erstellen. Jeder könnte mich aufklären, welche Methoden oder Anwendungen in Visual Basic dazu verwendet werden.

+0

Schauen Sie sich diese Frage: http://stackoverflow.com/questions/5893837/using-parameters-inserting-data-into-access-database – GregHNZ

+0

Danke, aber es immer noch ist nicht meine Probleme lösen. Die anderen Felder können problemlos aktualisieren, warum nur dieses Feld mir einen Fehler gibt? – bloom

+0

Ihr Code macht keinen Sinn. Warum rufen Sie 'ExecuteNonQuery' auf einem Befehl und' Update' auf einem Datenadapter auf? Sie müssen das eine oder das andere auswählen, je nachdem, was besser ist. Die erste Option wäre die, die Sie verwenden möchten, wenn Sie die Daten nicht zuerst aus der Datenbank abrufen möchten oder müssen. – jmcilhinney

Antwort

0

Keine Notwendigkeit zum Erstellen der Update-Abfrage Hand. Der CommandBuilder selbst erzeugt die notwendigen Anweisungen, um die Datenbank zu aktualisieren.

Dim ds As New DataSet 
Dim da As OleDbDataAdapter 
Dim MaxRows As Integer 
Dim i As Integer 
Dim sql As String 

Private Sub updateButton_Click(sender As Object, e As EventArgs) Handles updateButton.Click 
Using myConnection = New OleDbConnection("Provider = Microsoft.ACE.OLEDB.12.0; Data Source =C:\LecturerDetail.mdb") 
     myConnection.Open()   
     Dim str As String 
     str = "SELECT * FROM lecturer WHERE ([empId] = @empId)" 
     Dim cmd As OleDbCommand = New OleDbCommand(str, myConnection)  
     cmd.Parameters.AddWithValue("@empId", empIdTxt.Text) 

     Try 
      da = new OleDbDataAdapter(cmd) 
      da.Fill(ds,"lecturer")    
      ds.Tables("lecturer").Rows(i).Item(0) = empIdTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(1) = nameTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(2) = positionComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(3) = facultyComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(4) = empDeg1.Text 
      ds.Tables("lecturer").Rows(i).Item(5) = empDeg2.Text 
      ds.Tables("lecturer").Rows(i).Item(6) = empDeg3.Text 
      ds.Tables("lecturer").Rows(i).Item(7) = empDeg4.Text 
      ds.Tables("lecturer").Rows(i).Item(8) = empTypeComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(9) = icTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(10) = citizenshipComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(11) = phoneTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(12) = emailTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(13) = permitNoTxt.Text 
      ds.Tables("lecturer").Rows(i).Item(14) = DateTimePicker1.Value 
      ds.Tables("lecturer").Rows(i).Item(15) = DateTimePicker2.Value 
      ds.Tables("lecturer").Rows(i).Item(16) = statusComboBox.Text 
      ds.Tables("lecturer").Rows(i).Item(17) = remark.Text 
      Dim cb As New OleDb.OleDbCommandBuilder(da) 
      da.Update(ds, "lecturer") 
      ds.AcceptChanges() 
      myConnection.Close() 
      MsgBox("Record Updated") 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & "-" & ex.Source) 
     End Try 

    End Using 
End Sub 
+0

Ich versuchte das oben genannte aber es gibt Fehler, OleDbCommand muss alle Parameter einstellen .... – bloom