2016-11-21 11 views
0

Вот пример кода: Все остальное работает, но продолжайте получать ошибку обновления синтаксиса? SQL проверен и работает как запрос SQL снаружи.OleDbConnection UPDATE Синтаксис Ошибка, SQL работает, но не обновляет DataBase

public bool changes() 
    { 


     OleDbConnection myConnection = GetConnection(); 

     string myQuery = "UPDATE Login SET Pass='" + textBox1.Text + "' WHERE User='" + textBox2.Text + "'"; 

     OleDbCommand myCommand = new OleDbCommand(myQuery, myConnection); 

     try 
     { 
      myConnection.Open(); 
      myCommand.ExecuteNonQuery(); 
      myConnection.Close(); 

     } 
     catch (Exception ex) 
     { 
      MessageBox.Show(ex.Message); 
      return false; 
     } 

     return true; 
    } 
+0

Какие РСУБД вы используете и распечатываете переменную 'myQuery' и видите, что она печатает. – Rahul

+0

Provider = Microsoft.ACE.OLEDB.12.0: using: файл типа Database.accdb, который является локальным файлом. После отладки получите правильные значения для обновления, но после того, как он использует метод ExecuteNonQuery(), он переходит прямо к исключению catch ex. Нет проблем с подключением к базе данных, а также имя поля и базы данных в SQL. – Sam

+0

Каковы детали исключения? –

ответ

2

Ну, это из-за вашей части WHERE, как показано ниже. User в MS Access reserve word и, таким образом, должен быть экранирован с помощью [] как

WHERE [User]='" + textBox2.Text + "'" 

Кроме того, ваш нынешний подход уязвим к SQL-инъекции. Вместо этого используйте параметризованный запрос, как предлагается в другом ответе.

+0

хороший улов на зарезервированном слове. –

+0

Это имеет смысл. Плохой выбор имени поля. Тем не менее, он упомянул, что он смог запустить запрос вручную ... – JuanR

+0

@Juan, это ошибка, сделанная, вероятно, OP во время публикации. Потому что его опубликованный запрос даже не запускается при запуске вручную. – Rahul

1

Используйте параметры вместо конкатенации значений в строке:

https://msdn.microsoft.com/en-us/library/system.data.oledb.oledbcommand.parameters(v=vs.110).aspx

Вот пример кода с используя заявление (как кто-то рекомендовал, для правильной утилизации ресурсов) :

using (OleDbConnection conn = new OleDbConnection(ConnString)) 
{ 
    using (OleDbCommand cmd = new OleDbCommand(SqlString, conn)) 
    { 
    cmd.CommandType = CommandType.Text; 
    cmd.Parameters.AddWithValue("FirstName", txtFirstName.Text); 
    cmd.Parameters.AddWithValue("LastName", txtLastName.Text); 
    conn.Open(); 
    cmd.ExecuteNonQuery(); 
    } 
} 
+0

Запрос выглядит как звук. Мне кажется, что причина не в том, что входы должны содержать символы, вызывающие ошибки с драйвером (поскольку запрос работает снаружи). Я больше, чем Я хочу, чтобы он сделал комментарий, но мне кажется, что у него есть вопрос (почему это не работает), и я дал ответ (потому что вы объединяете строки вместо использования параметров). Сообщите мне, почему вы думаете, что это должно быть комментарий. Если у вас есть убедительный аргумент, я сделаю это один. – JuanR

+0

Убрано комментарий, так как теперь ваше редактирование добавляет ценность. Но это не настоящая проблема. См. мой ответ. – Rahul

+0

Я добавил, что, Параметры для кода. Все еще заканчивается тем же синтаксисом. О Господи. Вождение меня по стене. – Sam