.net - ADO.NET 超时但在 SSMS 中工作正常

标签 .net sql sql-server sql-server-2008 ado.net

我正在尝试使用 SQL Server 2008R2 从 ADO.NET 运行查询。我使用 CTE 提供分页并为 @Offset@Limit 添加参数,它们都是整数。

我正在根据用户输入构建参数化查询。最终输出是这样的:

;WITH Results_CTE AS (
    SELECT  ld.* , ROW_NUMBER() OVER (ORDER BY Key_Field) AS RowNum  
    FROM list..List_Data ld 
    WHERE VALUE_2010 IS NOT NULL  
    AND  Postcode LIKE @Postcode + '%' 
) SELECT * FROM Results_CTE 
    WHERE RowNum > @Offset AND RowNum < @Offset + @Limit 
OPTION (RECOMPILE) 

我使用了一些类似的子句,这就是为什么我有OPTION RECOMPILE。如果我通过 SSMS 声明参数并像这样运行:

declare @postcode varchar(10) = 'SW1 1AA';
declare @Offset int = 0;
declare @Limit int = 10;

我的响应时间非常快(不到 1 秒)。然而,如果我尝试使用 ADO.NET,则需要很长时间。我尝试过添加以下两个参数:

cmd.Parameters.AddWithValue("@Offset", startRowIndex) // times out
cmd.Parameters.AddWithValue("@Limit", limit)

cmd.Parameters.Add(New SqlParameter("@Offset", SqlDbType.BigInt)) // also times out
cmd.Parameters.Item("@Offset").Value = startRowIndex
cmd.Parameters.Add(New SqlParameter("@Limit", SqlDbType.BigInt))
cmd.Parameters.Item("@Limit").Value = limit

如果第一个查询只返回几行,并且我放弃了 @Offset 和 @Limit 过滤,我会得到不错的响应时间。有没有办法可以加快速度并使用分页?

编辑:我传入 @postcode 参数(这是 .NET 中的一个字符串,通过以下方式:

cmd.Parameters.AddWithValue("@Postcode", normalizedPostcode)

最佳答案

您的 ADO.NET 代码正在传递参数 a different datatype与您在 SSMS 中测试的版本相比,您会遇到隐式转换问题。

不要使用

cmd.Parameters.AddWithValue("@postcode", normalizedPostcode)

因为这将自动创建一个 nvarchar 参数,并且您将在执行计划中获得隐式强制转换,这意味着无法使用索引。而是传入 varchar 类型的显式创建参数。

cmd.Parameters.Add("@postcode", SqlDbType.Varchar, 10)

关于.net - ADO.NET 超时但在 SSMS 中工作正常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7875254/

相关文章:

mysql - 通过模型设计避免条件连接

PHP fatal error : Call to undefined function mssql_query()

.net - 使用 NetTcpBinding 通过 WCF 流式传输

c# - 如果我的具体类除了其他接口(interface)之外还需要简单的数据类型,如何设置依赖项注入(inject)?

sql - 没有右表中的多行的左连接

sql从 "record per month"转换为 "record from/until"

sql-server - 将 .bacpac 文件从本地上传到 Azure 时出错

c# - 如何将相对路径转换为 ​​C#/.NET 中的完全限定路径?

c# - 如何将 Beckhoff TwinCAT 3 链接到用 C# 创建的 Visual Studio HMI?

sql - 从一个表中选择所有记录,并在另一个表中为不符合条件的行显示 0