【问题标题】:c# sql search with LIKE时间:2019-04-10 标签:c#sqlsearchwithLIKE
【发布时间】:2015-02-10 14:08:33
【问题描述】:

我有一个由 Artist 搜索并尝试在 sql 查询中使用 LIKE 但失败的演出数据库。

我试过了:

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '[%" + Artist + "%]'";

不带回任何记录

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%[" + Artist + "]%'";

返回所有记录

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '" + Artist + "'";

不带回任何记录

我尝试过以各种方式使用 CONTAINS,但总是得到相同的错误:

System.Web.Services.Protocols.SoapException:服务器无法处理请求。 ---> System.Data.SqlClient.SqlException:关键字“CONTAINS”附近的语法不正确。 在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection) 在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning(TdsParserStateObject stateObj) 在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj) 在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData() 在 System.Data.SqlClient.SqlDataReader.get_MetaData() 在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds,RunBehavior runBehavior,字符串 resetOptionsString) 在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,布尔异步) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法,DbAsyncResult 结果) 在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior,RunBehavior runBehavior,布尔 returnStream,String 方法) 在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法) 在 System.Data.SqlClient.SqlCommand.ExecuteReader() 在 C:\Users\strscac\Desktop\VS\WebService1\WebService1\WebService1\Service1.asmx.cs:line 36 中的 WebService1.Service1.Search(String Artist) 处

【问题讨论】:

  • 你为什么要在like中使用方括号[]?尝试像 '%" + Artist + "%'
  • 另外,您似乎没有使用参数化查询。

标签: c# sql sql-like


【解决方案1】:

您错过了一种有效的组合:

string strSQL = "SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%" + Artist + "%'";

正如 wahwahwah 所说,我相信其他人也会这样做:作为一种良好做法,学习和使用参数化查询来避免 SQL 注入漏洞。

有关参数化查询的简单示例,请查看 System.Data.SqlClient.SqlCommand.Parameters 的 MSDN 文档。

【讨论】:

  • 那行得通,谢谢,只是为了回答你的问题 - 我在这里看到的是括号:stackoverflow.com/questions/6231744/…
  • @user3606041 在该示例中,[] 用作“转义字符”以表示查询正在查找包含 % 的结果 - 例如,如果您将 5% 作为值在您的数据库中。
  • @user3606041 另请阅读 Cory 发布的链接。你不应该在生产环境中使用这里的语句。
  • @user3606041 查询的正确参数化版本为"SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%' + @Artist + '%'",然后您将添加一个名为@Artist的参数
【解决方案2】:

试试这样的:

string strSQL = string.Format("SELECT * FROM TB_CA_gigs WHERE Artist LIKE '%{0}%'", Artist);

尽管您应该始终参数化您的值(例如,Artist 应该是一个参数)以防止 SQL 注入攻击。

【讨论】:

  • 嗯...这不是创建参数化查询的意思。如果Artist = DROP TABLE Artist 会怎样?您的示例与 OP 使用的示例没有什么不同...see here
  • 是的......这就是为什么我说“虽然你应该”而不是“这是一个例子”。如果 OP 询问如何创建参数化查询,我会为他们指出正确的方向。事实上,我将其作为最佳实践的注释(嗯,更像是最低可接受的实践)。
  • 从您的预编辑帖子中,这一点都不清楚(现在真的不是很清楚)......但屈尊俯就绝对是有价值的 :)
猜你喜欢
  • 2016-04-19
  • 2022-01-16
  • 2018-07-04
  • 2019-06-02
  • 1970-01-01
  • 1970-01-01
  • 2013-05-26
  • 2013-06-03
  • 2018-09-10
相关资源
最近更新 更多