C# WinFroms "Ошибка синтаксиса в инструкции INSERT INTO."
Я пытаюсь добавить новую запись в бд через форму, но при нажатии на кнопку появляется ошибка в строке с query. Никак не могу понять, что делаю не так..
string region = dataGridView1.Rows[index].Cells[0].Value.ToString();
string country = dataGridView1.Rows[index].Cells[1].Value.ToString();
var in2021= float.Parse(dataGridView1.Rows[index].Cells[2].Value.ToString());
var in2022 = float.Parse(dataGridView1.Rows[index].Cells[3].Value.ToString());
dbConnection.Open();
string query = "INSERT INTO Таблица (Регион, [Страна], Показатели в 2021, Показатели в 2022) VALUES ('" + region + "','" + country + "'," + in2021 + "," + in2022 + ")";
OleDbCommand dbCommand = new OleDbCommand(query, dbConnection);
dbCommand.ExecuteNonQuery();
dbConnection.Close();
Ответы (2 шт):
всегда заключайте наименования таблиц и их колонки в [], если они у вас с пробелами или не английские:
string query = "INSERT INTO [Таблица] ([Регион], [Страна], [Показатели в 2021], [Показатели в 2022]) VALUES ('" + region + "','" + country + "'," + in2021 + "," + in2022 + ")";
и лучше использовать параметризованный запрос, иначе возможны инъекции
Вы когда клеите SQL запрос из строк - меня прямо укачивает! И хочется написать в стиле C# 6.0:
string query = $"INSERT INTO [Таблица] ([Регион], [Страна], [Показатели в 2021], [Показатели в 2022])
VALUES ( '{region}', '{country}', {in2021}, {in2022} )";
Но, к сожалению, это не исправляет ситуацию, и всё остаётся так же уныло.
Хорошим варинатом был бы переход к так называемым параметризованным запросам, что Вам уже посоветовали, кажется, в первом же комментарии.
Приблизительно это выглядит так:
string query = "INSERT INTO [Таблица] ([Регион], [Страна], [Показатели в 2021], [Показатели в 2022])
VALUES ( @region, @country, @in2021, @in2022 )";
OleDbCommand dbCommand = new OleDbCommand(query, dbConnection);
dbCommand.Parameters.AddWithValue("@region", region);
dbCommand.Parameters.AddWithValue("@country", country);
dbCommand.Parameters.AddWithValue("@in2021", in2021);
dbCommand.Parameters.AddWithValue("@in2022", in2022);
dbCommand.ExecuteNonQuery();
dbConnection.Close();
Видите, как всё изменилось? В строке запроса остались только формальные параметры. А потом Вы к этим параметрам "приставляете" значения. При этом гораздо меньше мест, в которых можно ошибиться.
Правда, есть еще мнение, что использование "AddWithValue" - это зло в чистом виде, и, возможно, этот метод вообще придуман самим Люцифером. На эту тему можете прочитать вот этот ответ на вопрос. Но на том элементарном уровне, когда Вы выполняете простой INSERT в базу - Вас различие между AddWithValue и просто Add (метод, придуманный правильными пацанами) - не должно заботить.