#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:
Вероятно, ваша проблема заключается в этих трех:
- Явная синтаксическая ошибка, неясно видимая с отвратительным непараметризованным SQL-оператором: p
newUser
или какое-то другое поле имеет'
где-то и искажает синтаксис.- Вы пытаетесь вставить числовое значение (
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();