65.9K
CodeProject 正在变化。 阅读更多。
Home

MySqlCommand、MySqlParameter 和带有百分号的 "LIKE"

starIconstarIconstarIconstarIconstarIcon

5.00/5 (1投票)

2013 年 4 月 1 日

CPOL
viewsIcon

33884

如何在 MySQL .NET / 连接器中使用 MySQLParameter 进行带有 LIKE 的文本搜索

引言

在使用 GetSqlStringCommand 进行文本比较时,在 ADO.NET 中使用 LIKE,并且使用 MySqlParamenter 时,通过 MySQL 客户端手动执行命令和通过 ADO.NET 执行命令的结果会不同。

背景

当您编写如下命令时,会发生这种情况:"SELECT * FROM users WHERE name LIKE '%John%'",这将返回

John Frank
Johnny Philips
H. F. John

但是对于 ADO.NET,如果您设置一个 var,例如 "@name",并像这样更新命令 "SELECT * FROM users WHERE name LIKE '%@name%'",ADO.NET 会将其视为字符串 '@name',您将返回 0 个结果,因为不存在名为 @name 或电子邮件为 @name 的用户,但存在电子邮件域名为 "name.com" 的用户,例如 alberto@name.com,但这是一种巧合,而不是我们期望的结果。

因此,您需要删除单引号,并在前后附加 "%" 来设置值。

Using the Code

//Wrong way
MySqlCommand cmd = oldDb.GetSqlStringCommand(CommandType.Text,"SELECT * _
FROM users WHERE name LIKE '%@name%'");
MySqlParameter nameParameter= cmd.CreateParameter();
nameParameter.DbType = DbType.String;
nameParameter.ParameterName = "@name";
nameParameter.Value = "John";

//Good way
MySqlCommand cmd = oldDb.GetSqlStringCommand(CommandType.Text,"SELECT * _
FROM users WHERE name LIKE @searchText");
MySqlParameter nameParameter= cmd.CreateParameter();
nameParameter.DbType = DbType.String;
nameParameter.ParameterName = "@searchText"
nameParameter.Value = "%John%"; 
© . All rights reserved.