显然,以下代码不会按预期打印任何内容.我确信这与我尝试将项目列表放入的事实有关@namelist
.显然,它不仅仅是文本替代品.
我怎么解决这个问题?谢谢
using (var connection = new SqlConnection(_connectionString))
{
connection.Open();
using (var cmd = connection.CreateCommand())
{
cmd.CommandText = @"select column_name, table_name from information_schema.columns where table_name in (@namelist)";
cmd.Parameters.AddWithValue("@namelist", "'tableOne', 'tableTwo'");
var reader = cmd.ExecuteReader();
while (reader.Read())
{
var a = reader[0];
Console.WriteLine(a);
}
}
}
Run Code Online (Sandbox Code Playgroud)
不幸的是,SQL参数没有以这种方式解析,换句话说,后端不只是构建一个安全字符串,用它的值替换每个参数.相反,您必须动态构建参数列表:
cmd.CommandText = @"select column_name, table_name from information_schema.columns where table_name in (@p1, @p2, @p3)"; // This can be built dynamically
Run Code Online (Sandbox Code Playgroud)
然后添加每个参数:
cmd.Parameters.AddWithValue("@p1", "tableOne");
cmd.Parameters.AddWithValue("@p2", "tableTwo");
cmd.Parameters.AddWithValue("@p3", "tableThree");
Run Code Online (Sandbox Code Playgroud)
您当然可以在循环中添加这些参数,如果数字在运行时未知:
for(var i = 0; i < myParams.length; i++)
{
cmd.Parameters.AddWithValue("@p" + i.ToString(), myParams[i]);
}
Run Code Online (Sandbox Code Playgroud)
如果您的表列表存储在一个表中enum
,或者您可以使用正则表达式对它们进行转义或验证它们,那么自己构建原始SQL并且根本不使用参数也是相当安全的.
当然,这是我使用PostgreSQL的一个重要原因; 对数组的本机支持.
归档时间: |
|
查看次数: |
7975 次 |
最近记录: |