Ошибка синтаксиса в инструкции INSERT INTO с использованием С# с ms-доступом

70
6

У меня возникли проблемы с выяснением, что не так с моим кодом. Я пытаюсь добавить запись в свой Access Db через С#, но столкнулся с исключением, которое говорит, что у меня неправильный синтаксис в моей инструкции SQL.

 private void buttonSUB_Click(object sender, EventArgs e)
{
string Adrs = textADRS.Text;
string Fname = textFN.Text;
string Mname = textMN.Text;
string Lname = textLN.Text;
string Pos = textPOS.Text;

try
{

OleDbConnection con = new OleDbConnection();
con.ConnectionString = @"Provider = Microsoft.ACE.OLEDB.12.0; Data Source = C:\\Users\\genesis\\Documents\\Database1.accdb";
OleDbCommand cmd = new OleDbCommand("Insert into Employees (FN,MN,LN,Address,Position) Values (@FirstName,@MidName,@LastName,@Address,@Position)",con);
cmd.Parameters.Add(new OleDbParameter("@FirstName", Fname));
cmd.Parameters.Add(new OleDbParameter("@MidName", Mname));
cmd.Parameters.Add(new OleDbParameter("@LastName", Lname));
cmd.Parameters.Add(new OleDbParameter("@Address", Adrs));
cmd.Parameters.Add(new OleDbParameter("@Position", Pos));
con.Open();
cmd.ExecuteNonQuery();
MessageBox.Show("Record Submitted", "Nice!");
con.Close();
}

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

}

спросил(а) 2017-06-21T21:31:00+03:00 3 года, 4 месяца назад
1
Решение
108

Из списка Access зарезервированных слов SQL, POSITION уже определено как зарезервированное ключевое слово.

Если вы используете зарезервированное слово или символ для имени поля в таблице, Access предупреждает вас, что слово зарезервировано и вы можете столкнуться с ошибками при обращении к полю. Вы также можете столкнуться с ошибками, если используете зарезервированное слово для обозначения элемента управления, объекта или переменной.

Если зарезервированное слово уже используется, вы можете избежать сообщений об ошибках, окружая каждое вхождение слова скобками ([]).

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

OleDbCommand cmd = new OleDbCommand(
@"INSERT INTO Employees (FN, MN, LN, Address, [Position])
VALUES (@FirstName, @MidName, @LastName, @Address, @Position)", con);

NB: Зарезервированные слова не чувствительны к регистру при использовании Access, поэтому каждое событие, в котором используются зарезервированные слова, должно быть помещено в квадратные скобки.

ответил(а) 2017-06-22T06:11:00+03:00 3 года, 4 месяца назад
-4

попробуйте:

cmd.Parameters.Add(new OleDbParameter("@FirstName","'" + Fname "'"));

Одиночная карта со строковыми параметрами.

ответил(а) 2017-06-21T21:45:00+03:00 3 года, 4 месяца назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема