c# – 是否可以在SQLite查询中参数化表和列名称?

前端之家收集整理的这篇文章主要介绍了c# – 是否可以在SQLite查询中参数化表和列名称?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我试图从C#在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;

但是沿着“@search”行的错误不是一个正确的列名称“或类似的东西.如果我使用一个常量的列名,并且仅使用参数的数据可以工作,但是当我需要通过不同的列名搜索时,我不想创建10个不同的命令.

这里有什么问题?

解决方法

通常,像列名(或表名)这样的事情不能被参数化 – 而且有不同索引的事实意味着它将在内部必须是一个不同的计划.所以你必须使用连接 – 但要小心列出已知的列名以防止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;

猜你在找的C#相关文章