C# 构造参数查询 SQL - LIKE %

Posted

技术标签:

【中文标题】C# 构造参数查询 SQL - LIKE %【英文标题】:C# constructing parameter query SQL - LIKE % 【发布时间】:2010-10-14 10:33:29 【问题描述】:

我正在尝试为 C# 中的参数查询构建 SQL,该查询将包含 LIKE %% 命令。

这是我想要实现的(请注意数据库是 Firebird)

var SQL = string.format("SELECT * FROM 0 WHERE 1 LIKE '%?%'", TABLE, NAME);
 cmd.Parameters.AddWithValue(NAME, "JOHN");

现在我已经尝试了每一种排列以使参数起作用,我已经尝试过;

% 字符添加到参数中,

cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%");

cmd.Parameters.AddWithValue(NAME, "'%" + "JOHN" + "%'");

我似乎无法让它工作,我怎样才能使用 LIKE 查询的参数来工作。

欢迎提出建议!

【问题讨论】:

似乎缺少一些代码,您在哪里将 SQL 分配给命令?您遇到了什么错误,或者查询结果不是您所期望的? 是的,SQL 正在分配给 Cmd.CommandText 参数。 【参考方案1】:
var SQL = string.Format("SELECT * FROM 0 WHERE 1 LIKE '%' + ? + '%'", TABLE, NAME);
Cmd.CommandText = SQL;
Cmd.Parameters.Add("?", SqlDbType.VarChar, 50).Value = "JOHN";

【讨论】:

这个 SQL 对 Firebird 有效吗? 我没有看到 firebird 的要求。我更新了 sql 以确保它没问题,但是参数代码是错误的,因为 SqlDbType 枚举是为 Sql Server 准备的。不过,我仍然喜欢避免使用 AddWithValue 这对我不起作用。我收到以下错误; FirebirdSql.Data.FirebirdClient.FbException:不支持动态 SQL 错误表达式评估----> FirebirdSql.Data.Common.IscException:引发了“FirebirdSql.Data.Common.IscException”类型的异常。 对于Firebird(和标准SQL),你需要使用||连接运算符而不是+,即LIKE '%' || ? || '%' 我想看看如何使用 SQL Server 做到这一点,所以您的原始答案仍然有价值。您可以考虑在答案中显示这两个版本。【参考方案2】:

您不能在查询中的字符串文字中包含参数。将整个值作为参数,并将通配符添加到字符串中:

var SQL = string.format("SELECT * FROM 0 WHERE 1 LIKE ?", TABLE, NAME);
Cmd.Parameters.AddWithValue(NAME, "%" + "JOHN" + "%");

【讨论】:

仔细注意:他把通配符移到了参数上。这会起作用,但 imo 这是错误的做法。 @Myhiad:注意只有 ?在 like 运算符之后,没有通配符和撇号。 @Joel Coehoorn:没有理由粗鲁。该问题不包含有关更改参数后查询外观的任何信息。【参考方案3】:

过去这样做时,我只是将它集成到 sql 中,确保我用问号替换单引号来处理 sql 注入。例如:

var SQL = string.format("SELECT * FROM 0 WHERE 1 LIKE '%2%'",
  TABLE,
  NAME,
  JOHN.Replace("'","?"));

【讨论】:

最好用两个单引号替换单引号,这样包括引号在内的合法搜索才能真正起作用。 Replace("'", "''") 它暴露于 sql 注入攻击

以上是关于C# 构造参数查询 SQL - LIKE %的主要内容,如果未能解决你的问题,请参考以下文章

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)

SQL Server参数化SQL语句中的like和in查询的语法(C#)

c# dapper mysql like 参数化

C# 中是否支持 Like 和 ln 条件的参数化查询 ?

Sql Server参数化查询之where in和like实现详解