Можно ли параметризировать имена таблиц и столбцов в запросах SQLite? - PullRequest
11 голосов
/ 10 ноября 2010

Я пытаюсь выполнить параметризованный запрос в SQLite из C #, и метод, который я использую, аналогичен созданию статической команды с

        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;

но я получаю сообщение об ошибке "@search 'не является правильным именем столбца" или что-то в этом роде. если я использую постоянное имя столбца и использую данные только для параметров, это работает, но я не хочу создавать 10 разных команд, когда мне нужно искать по различным именам столбцов.

В чем здесь проблема?

Ответы [ 2 ]

14 голосов
/ 10 ноября 2010

Обычно такие вещи, как имена столбцов (или имена таблиц) могут не быть параметризованными - и тот факт, что существуют разные индексы, означает, что будет иметь , чтобы быть внутренним другим планом.Поэтому вам нужно будет использовать конкатенацию - , но , чтобы не допустить внедрения 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 голосов
/ 10 ноября 2010

Вы не можете использовать параметр запроса таким образом - чтобы указать имя столбца. Вы можете использовать его только для предоставления значений.

Рассмотрим что-то вроде этого:

    SQLiteCommand cmd = new SQLiteCommand(
    "SELECT [ID]" +
        ",[email]" +
        ",[serializedata]" +
        ",[restrictions]" +
    " FROM " + UserTable +
    " WHERE [" + search + "] = @searchparam", SQLConnection);

    cmd.Parameters.Add(new SQLiteParameter("@searchparam"));

Если вы контролируете все входные данные для этой функции и ни один, если они могут быть предоставлены кем-то, кроме вас, это должно быть безопасно. Но если search получено от ненадежной третьей стороны, обязательно выполните соответствующие проверки безопасности значения.

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