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#)