Синтаксическая ошибка C # при ВСТАВКЕ в инструкцию

#c# #insert #oledb

#c# #вставить #oledb

Вопрос:

У меня ошибка в строке: ins.ExecuteNonQuery() .toString(); Исключение OledDbException было необработанной синтаксической ошибкой в инструкции INSERT INTO.

Как мне это исправить?

 string strOleDbConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Project.mdb";

OleDbConnection objConnection = new OleDbConnection(strOleDbConnectionString);
string newTagID = textBox1.Text;
string newUser = textBox2.Text;
string newAge = textBox3.Text;
string newPhoneNumber = textBox4.Text;

string insertString = "INSERT INTO jiahe ([Tag ID], User, Age, [Phone Number]) VALUES ('"   newTagID   "', '"   newUser   "', '"   newAge   "', '"   newPhoneNumber   "')";

OleDbCommand ins = new OleDbCommand(insertString, objConnection);
ins.Connection.Open();
ins.ExecuteNonQuery().ToString();
ins.Connection.Close();
  

Комментарии:

1. Посмотрите на использование параметризованных запросов для поставщика OleDb.

2. Это не отвечает на ваш вопрос, и это зависит от вашей пользовательской базы, но можете ли вы позволить себе не беспокоиться о внедрении SQL в ваше приложение?

3. пусть ваш код выдаст сгенерированную строку insertString . Вероятно ' , ошибка в одном из вставленных значений вызывает синтаксическую ошибку.

4. Потому что это было упомянуто, но не связано. Сначала прочитайте это, затем выполните еще много поисков, пока вы действительно не поймете проблему: en.wikipedia.org/wiki/SQL_injection

5. Извините, я на самом деле очень новичок в C #. Что такое SQL-инъекция? И да, я вижу ошибку в newAge, но это не вызывает синтаксическую ошибку, верно? Ошибка ‘ во вставленных значениях?

Ответ №1:

Вероятно, ваша проблема заключается в этих трех:

  1. Явная синтаксическая ошибка, неясно видимая с отвратительным непараметризованным SQL-оператором: p
  2. newUser или какое-то другое поле имеет ' где-то и искажает синтаксис.
  3. Вы пытаетесь вставить числовое значение ( Age ?) в виде строки.

Вы должны легко решить первые два, создав точку останова после insertString построения инструкции и проверив, что на самом деле содержит строка. Третий вариант проверить еще проще, просто просмотрите типы данных полей таблицы в вашей базе данных.

Ответ №2:

Несмотря на это, вам следует изменить использование вашей команды, чтобы использовать параметры, а не создавать строку запроса с помощью конкатенации строк (которая подвержена атакам sql-инъекций).

Проблема, скорее всего, в том, что [Идентификатор тега], пользователь, возраст, [Номер телефона] — это не все строки. В вашем SQL любые данные столбца, не являющиеся строками, не должны заключаться в кавычки (‘).

Чтобы устранить непосредственную проблему (при условии, что [идентификатор тега] является целым числом):

     string insertString = "INSERT INTO jiahe ([Tag ID], User, Age, [Phone Number]) VALUES ("   newTagID   ", '"   newUser   "', '"   newAge   "', '"   newPhoneNumber   "')";
  

Тем не менее, вы должны структурировать свой код, чтобы избежать внедрения sql, иметь более чистый код, а также не беспокоиться о кавычках:

     string insertString = "INSERT INTO jiahe ([Tag ID], User, Age, [Phone Number]) VALUES (@TagID, @User, @Age, @PhoneNumber)";

    OleDbCommand ins = new OleDbCommand(insertString, objConnection);
    ins.Parameters.Add(new OleDbParameter("@TagID",newTagID);
    ins.Parameters.Add(new OleDbParameter("@User",newUser);
    ins.Parameters.Add(new OleDbParameter("@Age",newAge);
    ins.Parameters.Add(new OleDbParameter("@PhoneNumber",newPhoneNumber);
    ins.Connection.Open();
    ins.ExecuteNonQuery();
    ins.Connection.Close();