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 шт):

Автор решения: Konst

всегда заключайте наименования таблиц и их колонки в [], если они у вас с пробелами или не английские:

string query = "INSERT INTO [Таблица] ([Регион], [Страна], [Показатели в 2021], [Показатели в 2022]) VALUES ('" + region + "','" + country + "'," + in2021 + "," + in2022 + ")";

и лучше использовать параметризованный запрос, иначе возможны инъекции

→ Ссылка
Автор решения: S.H.

Вы когда клеите 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 (метод, придуманный правильными пацанами) - не должно заботить.

→ Ссылка