gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 06:20:05 30 4
gpt4 key购买 nike

我正在尝试从 C# 在 SQLite 中执行参数化查询,我使用的方法是使用

创建静态命令
        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 注入(inject):

    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# - 是否可以在 SQLite 查询中参数化表名和列名?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4141599/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com