2013-03-27 6 views
0

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

Моя проблема в том, что когда я обновляю список, я получаю сообщение об ошибке, в котором говорится о синтаксической ошибке в моем заявлении о обновлении, но я не могу ее найти. Я использую visual studio 2012, разрабатывая в VB.NET и используя базу данных доступа, доступную через соединение OleDB.

Вот код VB в вопросе

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click 
    If InOutComboBox.SelectedItem = "IN" Then 
     MessageTextBox.Text = "" 
    End If 
    con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb") 
    con.Open() 
    If ListView1.SelectedIndices.Count > 0 Then 
     Dim comStr As String = "UPDATE tblStaffNames SET OutIn = '" & InOutComboBox.SelectedItem & "', Note = '" & MessageTextBox.Text & "' WHERE recid = " & ListView1.SelectedItems(0).SubItems(0).Text 
     cmd = New OleDbCommand(comStr, con) 
     Try 
      cmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & " - " & ex.Source) 
     End Try 
    End If 
    ListView1.Clear() 
    LoadList() 

End Sub 

А вот стоимость образец comStr, когда я запускаю код

UPDATE tblStaffNames SET OutIn = 'OUT', Note = 'on vacation' WHERE recid = 26 

Любая помощь будет высоко ценится. Спасибо.

+1

Какое сообщение об ошибке? – OldProgrammer

+0

Это терпит неудачу каждый раз или только иногда. Когда это произойдет, какова ценность MessageTextBox.Text? – JSR

+0

Точно такая же строка SQL дает вам ошибку, если вы делаете это через Access вместо этого? –

ответ

5

NOTE - зарезервированное ключевое слово для Jet-MsAccess.
Вам необходимо инкапсулировать квадратные скобки перед отправкой команды в базу данных.

У вас есть еще одна большая проблема в вашем запросе. Пользовательский ввод не может быть доверен на отправку непосредственно в базу данных с использованием конкатенации строк. Вы должны использовать параметризованном запрос (Sql Injection)

Using con = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=..\..\People.mdb") 
    con.Open() 
    If ListView1.SelectedIndices.Count > 0 Then 
     Dim comStr As String = "UPDATE tblStaffNames SET OutIn = ?, [Note] = ?" & _ 
       " WHERE recid = ?" 
     cmd = New OleDbCommand(comStr, con) 
     cmd.Parameters.AddWithValue("@p1", InOutComboBox.SelectedItem) 
     cmd.Parameters.AddWithValue("@p2", MessageTextBox.Text) 
     cmd.Parameters.AddWithValue("@p3", ListView1.SelectedItems(0).SubItems(0).Text) 
     Try 
      cmd.ExecuteNonQuery() 
     Catch ex As Exception 
      MessageBox.Show(ex.Message & " - " & ex.Source) 
     End Try 
    End If 
End Using 

Обратите внимание на порядок параметров, в OleDb позиционно, поэтому каждый параметр должен появиться в коллекции параметров в точном порядке, ожидаемым ? заполнителей.

Кроме того, как вы можете видеть, я добавил также оператор Using, который гарантирует правильное закрытие и удаление объекта соединения, когда вы закончите работать с ним.

+0

Спасибо, что работает сейчас. Это то, что я получаю для 1. не зная об этом, и 2 используя чью-то чужую базу данных – mlieven

+1

Спасибо, я подумал, но обратите внимание на зарезервированное слово, но не использовал Access, это долгое время, поэтому не было уверен, как сбежать от него , – Sparky

+0

И спасибо за этот дополнительный бит – mlieven

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