当前位置: 首页 > 面试题库 >

带有IN参数的SqlCommand问题

陈飞语
2023-03-14
问题内容

显然,以下代码不会按预期方式打印出任何内容。.我确信这与我尝试将项目列表放入中的事实有关@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);
        }
    }
}

问题答案:

不幸的是,SQL参数不能以这种方式 解析 ,换句话说,后端不只是构建一个安全字符串来替换每个参数的值。相反,您必须动态构建参数列表:

cmd.CommandText = @"select column_name, table_name from information_schema.columns where table_name in (@p1, @p2, @p3)"; // This can be built dynamically

然后添加每个参数:

cmd.Parameters.AddWithValue("@p1", "tableOne");
cmd.Parameters.AddWithValue("@p2", "tableTwo");
cmd.Parameters.AddWithValue("@p3", "tableThree");

如果在运行时之前还不知道这些参数,那么您当然可以在循环中添加这些参数:

for(var i = 0; i < myParams.length; i++)
{
   cmd.Parameters.AddWithValue("@p" + i.ToString(), myParams[i]);
}

如果您将表列表存储在中enum,或者可以转义它们或使用正则表达式对其进行验证,那么仅自己构建原始SQL而根本不使用参数也将是相当安全的。

当然,这是我使用PostgreSQL的重要原因之一;对数组的本机支持。



 类似资料:
  • 问题内容: 我使用以下代码从SQL Server表中进行选择: 它运行完美,但是我想防止SQL注入,所以我尝试使用: 当我尝试执行此操作时,SQL Server没有任何结果。 知道为什么吗? 问题答案: “为什么?” 这是因为很少有电影的名称中带有“ @Search”一词-即“ Indiana Jones and the Last @Search”。也许是《星际迷航3:@搜索Spock》。通过将其

  • 问题内容: 我一直在互联网上搜索,但似乎找不到任何能解释我的问题的信息(可能是因为我没有使用正确的搜索字符串),所以我在这里发帖希望有人可以帮助我有了这个。(我的程序是使用Visual Studio 2010编写的C#代码) 我注意到在C#中,有多种构造SQL命令的方法。 到目前为止,我没有任何问题。我遇到的问题是。我在我的代码(/ / / )中使用了几个不同的命令,但让我们举个例子。 上面两个示

  • 问题内容: 执行查询时如何在JDBC的prepareStatement中设置in子句的值。 例: 如果此条款可 问题答案: 我要做的是添加一个“?” 对于每个可能的值。 例如: 然后愉快地设置参数

  • 问题内容: 我只是在阅读有关如何在.NET中向SqlCommand添加参数的问题,这对我提出了一个问题。在我的所有程序中,这就是我向命令中添加参数的方式: 我知道您也可以通过以下方式添加参数: 以下哪种添加参数的方法更好?有关系吗?我知道使用Sql名称空间对SQL Server查询更有效,所以我的第一个响应就是使用SqlParameter会更高效。但是,由于它已经是SqlCommand,所以我对此

  • 问题内容: 我有一个小问题。我有一个选择是情节的。我希望能够传递类似的数字。但是,这不起作用-解释这是一个位置参数。如果我这样做了,请执行以下操作:将其读取为负数。是否可以阅读? 下面的代码,和我将如何运行它的一个示例是: 如果我执行以下操作,则可以: 编码: 尽管我可以使它以这种方式工作,但我确实更希望能够使用科学计数法。谁有想法? 干杯 问题答案: 正如评论所指出的那样,问题在于前缀被解析为选

  • 我们目前正在Cent OS机器上与Tomcat 6和Java 7一起使用JProfiler 8.0.4,以准备评测模式。我们使用具有浮动许可证的JProfiler。我们在远程服务器上提取了JProfiler Linux存档。 Tomcat由Tanuki Wrapper管理。这是我们的配置 这很有效,当启动时,我们在日志中发现了这一点 最后,我们正在与我们的JProfiler客户联系,以获得代理和一