c# - 当我运行 C# 参数化查询时,它超时。具有硬编码参数的相同查询工作正常

标签 c# sql-server

我想获取文本列包含字符串过滤器的所有 ID。

当我运行这个参数化查询时,它超时了:

SqlCommand cmd =
new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE @filter", conn);
 if (filter != null)
 {
    cmd.Parameters.AddWithValue("@filter", "%" + filter + "%");
    SqlDataReader reader;
    reader = cmd.ExecuteReader(); //Locks up here!
 }

当我运行相同的代码,但使用硬编码的搜索参数时,它会及时返回我想要的结果:

 SqlCommand cmd = 
 new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE '%patternToMatch%'", conn);
 SqlDataReader reader;
 reader = cmd.ExecuteReader();

这两个查询有什么不同?我认为参数化不仅仅是简单的文本替换。

澄清:我正在与 Microsoft SQL Server 2012 服务器通话。

新信息:只有当搜索过滤器超过 6 个字符时才会超时。

编辑:已解决!我将搜索设置为存储过程:

CREATE PROCEDURE TextSearch 
@filter varchar(MAX) = ''
AS
BEGIN
    SET NOCOUNT ON;
    SELECT DISTINCT ID FROM TableName WHERE [Text] LIKE '%' + @filter + '%'
END
GO

最佳答案

使用 like 运算符的参数化查询时,需要将通配符单引号:

new SqlCommand("SELECT ID FROM TableName WHERE Text LIKE '%' + @filter + '%' ", conn);

然后像往常一样添加参数:

cmd.Parameters.AddWithValue("@filter", filter);

关于c# - 当我运行 C# 参数化查询时,它超时。具有硬编码参数的相同查询工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14881161/

相关文章:

c# - DbContext 类,找不到

c# - 使用参数创建新线程时索引超出范围?

sql-server - Visual Studio 2017没有商业智能集成服务/项目

sql-server - SSIS 包在设计模式下显示空白屏幕

sql - 尝试编写查询以指定客户是否完成了特定列的两种类型

具有不同运行时的 C# While 循环

c# - LINQ查询相当于SQL

C#,是否可以在不创建新对象变量的情况下重铸对象并访问方法和属性

sql-server - 如何获取所有数据库用户的列表

asp.net - IIS 性能