SQLite command.Parameters.Add () не работает - PullRequest
0 голосов
/ 25 апреля 2020

Вот мой код.

public void setUpdate(List<string> code, string tableName)
{
            SQLiteConnection con = new SQLiteConnection(connection);
            SQLiteCommand UPDATE = new SQLiteCommand("UPDATE @TableName SET @ColumnName = @Value WHERE Key = @PK", con);
            UPDATE.Parameters.AddWithValue("@TableName", "TEST");
            UPDATE.Parameters.AddWithValue("@ColumnName", code[1]);
            UPDATE.Parameters.AddWithValue("@Value", code[2]);
            UPDATE.Parameters.AddWithValue("@PK", code[0]);
            using (con)
            {
                con.Open();
                UPDATE.ExecuteNonQuery();
            }
}

И я получаю это исключение

System.Data.SQLite.SQLiteException: 'SQL logic error
near "@TableName": syntax error'

Я уже пытался использовать

UPDATE.Parameters.Add(new SQLiteParameter("@TableName", DbType.String) .Value = tableName);

Все еще получаю то же исключение .

Я больше не знаю, как это решить. Я не хочу использовать конкатенацию, потому что она искажает запрос, когда вы передаете значение, подобное приведенному ниже.

Smith's

РЕДАКТИРОВАТЬ:

Я установил точку останова на

using (con)

Затем проверил команду Text. Результат:

"UPDATE @TableName SET @ColumnName = @Value WHERE Key = @PK"

Ответы [ 2 ]

0 голосов
/ 25 апреля 2020

Опять пытаемся создать запрос с именами столбцов from и, которые вы не можете использовать в качестве PARAMETER. Они должны быть исправлены в строке. НО ВНИМАНИЕ. НЕ ДОПУСКАЙТЕ, чтобы созданные вами детали таблицы / столбца / et c были получены из ненадежного источника, особенно из-за повреждения SQL -Injection.

Если ваша система контролирует происхождение И КВАЛИФИЦИРОВАНА, или иным образом внутренне контролирует передаваемое имя таблицы, И вы контролируете / уточняете передаваемое имя столбца, я бы изменил вашу функцию следующим образом:

public void setUpdate(List<string> code, string tableName)
{
   SQLiteConnection con = new SQLiteConnection(connection);
   SQLiteCommand UPDATE = new SQLiteCommand(
"UPDATE " + tableName + " set " + code[1] + " = @Value WHERE Key = @PK", con);

   UPDATE.Parameters.AddWithValue("@Value", code[2]);
   UPDATE.Parameters.AddWithValue("@PK", code[0]);
   using (con)
   {
      con.Open();
      UPDATE.ExecuteNonQuery();
      con.Close();
   }
}

Опять же, это при условии, что ВЫ контролируете и дезинфицируете происхождение параметра tableName и свой массив кода, второй элемент через [1], представляющий имя столбца. Значение настройки EQUAL TO и где клавиши EQUALS подходят для параметров. И если это не сработает, я бы начал с запроса, который, как вы знаете, является законным / понятным, просто для проверки функциональности с параметрами.

"UPDATE YourTable set YourColumn = @Value WHERE Key = @PK"
0 голосов
/ 25 апреля 2020

Я думаю, что есть проблема с именем таблицы в качестве параметра. Поэтому сначала попробуйте оставить все параметры, кроме имени таблицы (временным жестким кодом 'TEST') в запросе, и, если он работает, посмотрите на это: C# запрос с динамикой c имя таблицы

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...