2013-11-18 2 views
2

Я работаю над этой проблемой целую вечность! У меня есть MSAccess 2007 db, и я использую Visual Studio 2010 и Visual Basic для записи приложения, которое читает и записывает из базы данных. Чтение работает очень хорошо, но когда я пытаюсь написать обновленный пароль обратно в базу данных, он терпит неудачу. Первоначально у меня была простая «Синтаксическая ошибка», которая не была такой полезной, но с небольшим количеством исследований я заметил, что базы данных доступа, похоже, имеют проблемы с столбцами, называемыми паролями. Я переименовал, что и попробовал еще раз, теперь я получаю эту ошибку, когдаОшибка синтаксиса в операторе обновления для базы данных Access (с использованием OleDbCommandBuilder)

da.Update (DS, "all_users")

команды.

полное сообщение об ошибке от VS является: Syntax error (missing operator) in query expression '((ID = ?) AND ((? = 1 AND Forename IS NULL) OR (Forename = ?)) AND ((? = 1 AND Surname IS NULL) OR (Surname = ?)) AND ((? = 1 AND User_Level IS NULL) OR (User_Level = ?)) AND ((? = 1 AND Last Logon IS NULL) OR (Last Logon = ?)) AND ((? = 1 AND Allow IS NU'.

Мой код следующим образом:

Private Sub btnSave_Click(snder as System.Object, e As System.EventArgs) Handles btnSave.Click 
    Dim Con As New OleDb.OleDbConnection 
    Dim ConString As String 
    Dim ds As New DataSet 
    Dim da As OleDb.OleDbDataAdapter 
    Dim Sql As String = "SELECT * FROM tblUsers" 
    ' 
    ConString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & _ 
     Application.StartupPath & "\Data\Users.accdb;Jet OLEDB:Database Password=---------;" 
    Con.ConnectionString = ConString 
    Con.Open() 
    da = New OleDb.OleDbDataAdapter(Sql, Con) 
    da.Fill(ds, "All_Users") 
    'Now loop through the records until you find the one for this user 
    For i = 0 To ds.Tables("All_Users").Rows.Count - 1 
     If ds.Tables("All_Users").Rows(i).Item(0).ToString = CurrentUser.ID Then 
      ds.Tables("All_Users").Rows(i).Item(6) = txtConfirmPassword.Text 
     End If 
    Next 
    CurrentUser.Password = txtConfirmPassword.Text 
    ' 
    Dim cb As New OleDb.OleDbCommandBuilder(da) 
    da.Update(ds, "All_Users") 
    ' 
    Con.Close() 
    MessageBox.Show("Your password has been sucessfully updated.", "Success", _ 
        MessageBoxButtons.OK, MessageBoxIcon.Information, MessageBoxDefaultButton.Button1) 
    Me.Close() 
+0

Это кажется у вас есть поле с именем * Last Logon *. Переименуйте это поле в * Last_Logon * (чтобы устранить пробел) и повторите попытку кода. – HansUp

ответ

2

При использовании OleDbCommandBuilder всегда устанавливать .QuotePrefix и .QuoteSuffix свойства:

Dim cb As New OleDb.OleDbCommandBuilder(da) 
cb.QuotePrefix = "[" 
cb.QuoteSuffix = "]" 
+0

Горд, что сработало. Большое спасибо – user3005433

+0

Дайте этому человеку сигару! +1 @Gord –

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