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

参数化动态SQL查询

南宫凯康
2023-03-14
问题内容

我有一个存储在列表中的关键字列表。

要从表中获取记录,请使用以下查询:

sqlBuilder.Append("SELECT name, memberid FROM members WHERE");
StringBuilder sqlBuilder = new StringBuilder();
foreach (string item in keywords)
            {
            sqlBuilder.AppendFormat(" LOWER(Name) LIKE '%{0}%' AND", item); 
            }
string sql = sqlBuilder.ToString();

您可能已经注意到,我的查询容易受到sql注入的攻击,因此我想通过SqlCommand()使用参数。我已经尝试了以下方法,但仍然无法正常工作:

foreach (string item in keywords)
            {    
                sqlBuilder.AppendFormat(" LOWER(Name) LIKE '%' + @searchitem + '%' AND", item);
                SqlCommand cmd = new SqlCommand(sqlBuilder.ToString());
                cmd.Parameters.AddWithValue("@searchitem",item);
             }

我在哪里犯错,或者应该怎么做?


问题答案:

您在这里做错了几件事:

  • 您为所有参数赋予相同的名称@searchitem。那行不通。参数需要唯一的名称。
  • 您为每个项目创建一个新的SqlCommand。那行不通。在循环开始时创建 一次 SqlCommand ,然后CommandText在创建完SQL后立即进行设置。
  • 您的SQL以结束AND,这是无效的语法。

改进建议(本质上没有错,但也不是最佳实践):

  • 正如Frederik所建议的那样,通常的方法是将%标记放在参数中,而不是在SQL内部进行字符串连接。
  • 除非您为数据库明确使用区分大小写的排序规则,否则比较应该不区分大小写。因此,您可能不需要LOWER

代码示例:

SqlCommand cmd = new SqlCommand();
StringBuilder sqlBuilder = new StringBuilder();
sqlBuilder.Append("SELECT name, memberid FROM members ");

var i = 1;
foreach (string item in keywords)
{
    sqlBuilder.Append(i == 1 ? " WHERE " : " AND ");
    var paramName = "@searchitem" + i.ToString();
    sqlBuilder.AppendFormat(" Name LIKE {0} ", paramName); 
    cmd.Parameters.AddWithValue(paramName, "%" + item + "%");

    i++;
}
cmd.CommandText = sqlBuilder.ToString();


 类似资料:
  • 本文向大家介绍Dapper.NET 用动态参数查询,包括了Dapper.NET 用动态参数查询的使用技巧和注意事项,需要的朋友参考一下 示例            

  • 问题内容: 我一直在试图弄清楚为什么以下代码未在我的ResultSet中生成任何数据: 另一方面,以下各项可以正常运行: SCHOOL的数据类型为CHAR(9字节)。除了setString,我还尝试了: 我完全留意接下来要研究什么;Eclipse调试器说,即使在setString或setCharacterStream之后,SQL查询也不会更改。我不确定这是因为设置参数不起作用,还是调试器根本无法在

  • 问题内容: 我问这个问题有点傻,因为我似乎是世界上唯一一个不了解这个问题的人,但是无论如何,这都是可行的。我将以Python为例。当我使用原始SQL查询(通常使用ORM)时,我会使用参数化,例如使用SQLite的以下示例: 方法A: 我知道这可行,我知道这是通常推荐的方式。SQL注入易受攻击的方式可以执行以下操作: 方法B: 到目前为止,我可以告诉我了解SQL注入,如本Wikipedia文章中所述

  • 我想在Select&Create table语句中向查询提供运行时值。参数化Athena SQL查询的方法有哪些?我尝试了从Presto中使用和语句,但它在Athena控制台中不起作用。我们需要任何像Python这样的外部脚本来调用它吗?

  • 我需要将动态查询参数发送到 REST Web 服务 GET 方法[如下所示]。 主机:端口/应用程序?字段1=值1 消费者可以将参数发送到字段和值。每个字段都映射到值。 有了这种类型的要求,我无法在服务器端方法上编写一组有限的 QueryParams。 我在用python和fastapi 谢谢你。

  • 我有一些BDD测试,用Wiremock检查回调的查询参数。所以,问题是当我构建RequestPatternBuilder动态时验证失败了。 更多详细信息 :我有一个包含查询参数的所需键/值对的映射,并且我想迭代它,以便构建 RequestPatternBuilder 对象。下面是算法: 验证失败,并显示以下消息: 但奇怪的是,如果我更改算法并添加查询参数,如下所示:,验证通过。 知道吗??