Можно ли параметризовать имена таблиц и столбцов в запросах SQLite?
Я пытаюсь выполнить параметризованный запрос в SQLite из С#, а метод im используется вдоль строк создания статической команды с
SQLiteCommand cmd = new SQLiteCommand(
"SELECT [ID]" +
",[email]" +
",[serializedata]" +
",[restrictions]" +
" FROM " + UserTable +
" WHERE @search = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
cmd.Parameters.Add(new SQLiteParameter("@search"));
и называя его следующим образом:
Command.Parameters["@searchparam"].Value = searchdata;
Command.Parameters["@search"].Value = search;
SQLiteDataAdapter slda = new SQLiteDataAdapter(UserSelectUsernameCommand);
DataSet ds = new DataSet();
slda.Fill(ds);
User[] array = new User[ds.Tables[0].Rows.Count];
int index = 0;
foreach (DataRow row in ds.Tables[0].Rows)
{
array[index] = new User(this, row);
index++;
}
return array;
но im получение ошибки вдоль строки "@search" не является правильным именем столбца "или что-то в этом роде. если я использую имя константного столбца и использую только данные для параметров, которые он работает, но я не хочу создавать 10 разных команд, когда мне нужно искать по разным именам столбцов.
В чем проблема?
Ответы
Ответ 1
В общем случае такие вещи, как имена столбцов (или имена таблиц), могут быть параметризованы не, а тот факт, что существуют разные индексы, означает, что он должен быть другим планом внутри. Поэтому вам нужно будет использовать конкатенацию - , но будьте осторожны с белыми списками известных имен столбцов, чтобы предотвратить SQL-инъекцию:
SQLiteCommand cmd = new SQLiteCommand(@"
SELECT [ID],[email],[serializedata],[restrictions]
FROM " + whiteListedUserTable + @"
WHERE [" + whiteListedColumnName + @"] = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
...
Command.Parameters["@searchparam"].Value = searchdata;
Ответ 2
Вы не можете использовать параметр запроса таким образом - указать имя столбца. Вы можете использовать его только для подачи значений.
Рассмотрим что-то вроде этого:
SQLiteCommand cmd = new SQLiteCommand(
"SELECT [ID]" +
",[email]" +
",[serializedata]" +
",[restrictions]" +
" FROM " + UserTable +
" WHERE [" + search + "] = @searchparam", SQLConnection);
cmd.Parameters.Add(new SQLiteParameter("@searchparam"));
Если вы контролируете все входные данные этой функции, и нет, если она может быть предоставлена кем-то, кроме вас, это должно быть безопасным. Но если search
поступает от ненадежной третьей стороны, обязательно сделайте соответствующие проверки безопасности на значение.