Почему говорится об ошибке в инструкции SQL Вставить в

Я учусь подключаться к Microsoft Access и писать в базу данных. Я создал базу данных в Access и хочу вставить в нее данные.

 OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");

 OleDbCommand cmd = new OleDbCommand();
 string FN = textBox1.Text;
 string LN = textBox2.Text;

 cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (FN,LN)";
 cmd.Connection = conn;

 conn.Open();
 cmd.ExecuteNonQuery();

Перед тем, как я побегу, похоже, что ошибки нет. Я запускаю программу, обновляю свои textBox1.text и textBox2.text и нажимаю СОХРАНИТЬ, после чего получаю сообщение об ошибке:

ОШИБКА СИНТАКСИСА в операторе SQL Вставить в

Что я сделал не так??


person Amin Elaghil    schedule 06.04.2017    source источник
comment
Вам необходимо выработать привычку использовать такие параметры: stackoverflow.com/questions/5893837/, что решит эту проблему и защитит вас от SQL-инъекции.   -  person Alex K.    schedule 06.04.2017
comment
В его нынешнем виде запрос не выполняется, потому что FN / LN не вставляются в строку автоматически.   -  person Alex K.    schedule 06.04.2017


Ответы (2)


Во вставке вы пытаетесь добавить значения FN и LN. Эти значения не существуют в области действия команды, поэтому он не знает, что с ними делать. Вместо этого вы хотите установить эти значения в качестве параметров, а затем добавить их вместе с их значением в команду:

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");
OleDbCommand cmd = new OleDbCommand();
string FN = textBox1.Text;
string LN = textBox2.Text;
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)";
cmd.Connection = conn;
cmd.Parameters.Add(new OleDbParameter("@FN", FN));
cmd.Parameters.Add(new OleDbParameter("@LN", LN));
conn.Open();
cmd.ExecuteNonQuery();
person Pikoh    schedule 06.04.2017
comment
oledb нужны ?, а не @IDENTIFIER заполнители, я думаю - person Alex K.; 06.04.2017
comment
Нет, он отлично работает с @, если вы используете Access. Важно сохранить добавление в коллекцию в том же порядке заполнителей. - person Steve; 06.04.2017
comment
@AlexK. это зависит от водителя - person Scott Chamberlain; 06.04.2017
comment
Я думаю, что это будет работать так, как говорили другие. Важно порядок - person Pikoh; 06.04.2017
comment
Я просто хотел бы прокомментировать для других пользователей: я видел много плакатов, в которых говорилось, что они не использовали параметры, потому что их было труднее использовать. Я думаю, этот ответ демонстрирует, что параметры так же просты, как и использование конкатенированных строк, и намного безопаснее. На самом деле, я думаю, это проще! - person Chris Dunaway; 06.04.2017
comment
Я полностью согласен с @ChrisDunaway. Параметры проще и безопаснее. Многие вопросы о вставке даты и времени могут быть решены просто с помощью параметров. - person Pikoh; 06.04.2017

Ваш код ломается, потому что FN и LN являются переменными C #, и вы пытаетесь передать их в запрос как есть. Это не приводит к правильному синтаксису в SQL.

Вам необходимо передать FN и LN в качестве параметров запроса.

Измените код на следующий.

OleDbConnection conn = new OleDbConnection(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Users\Amin\Desktop\NamesDatabase1.accdb");
OleDbCommand cmd = new OleDbCommand();
string FN = textBox1.Text;
string LN = textBox2.Text;
cmd.CommandText = "INSERT INTO Names (FirstName, LastName) Values (@FN,@LN)";
cmd.Parameters.Add(new OleDbParameter("@FN", FN));
cmd.Parameters.Add(new OleDbParameter("@LN", LN));
cmd.Connection = conn;
conn.Open();
cmd.ExecuteNonQuery();

Это должно решить вашу проблему.

person Chetan Ranpariya    schedule 06.04.2017