Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
.net SqlDataSource超时。OK在管理工作室_.net_Sql_Sqldatasource - Fatal编程技术网

.net SqlDataSource超时。OK在管理工作室

.net SqlDataSource超时。OK在管理工作室,.net,sql,sqldatasource,.net,Sql,Sqldatasource,在我继承的代码中,我有一个SqlDataSource,它有一个相当复杂的select语句,对于某些SelectParameters,该语句总是超时(“超时已过期。操作完成前超时时间已过,或者服务器没有响应”) 当我在ManagementStudio中使用相同的参数运行完全相同的查询时,查询永远不会超时,并且总是花费不到一秒钟的时间 有人知道这里可能有什么问题吗?我搞不懂。可能是锁定/阻塞,如果有人在数据库中工作,您选择的可能会等到他们的事务完成。根据数据库中的其他事务,超时将是命中还是未命中 在

在我继承的代码中,我有一个SqlDataSource,它有一个相当复杂的select语句,对于某些SelectParameters,该语句总是超时(“超时已过期。操作完成前超时时间已过,或者服务器没有响应”)

当我在ManagementStudio中使用相同的参数运行完全相同的查询时,查询永远不会超时,并且总是花费不到一秒钟的时间


有人知道这里可能有什么问题吗?我搞不懂。

可能是锁定/阻塞,如果有人在数据库中工作,您选择的可能会等到他们的事务完成。根据数据库中的其他事务,超时将是命中还是未命中

在ManagementStudio中,运行
将SHOWPLAN\u ALL设置为ON
,然后运行查询。在输出中查找“扫描”。如果您进行了表或索引扫描,您更有可能成为锁定/块的受害者,因为您必须处理整个索引/表,任何锁定其中一行的人都将迫使您等待

运行应用程序时,如果屏幕未刷新,请在management studio中快速运行:

EXEC sp_lock 

它将为您提供一些关于当前正在进行的任何锁定的基本信息。

只是在黑暗中拍摄:参数实际上并不相同。在SSMS中为查询传递ASCII参数,而在ADO.Net中传递Unicode参数<当
myValue
是字符串时,code>SqlCommand.Parameters.AddWithValue(“@myParam”,myValue)将添加一个NVARCHAR类型的参数。由于SQL中的te转换规则,如果您有
选择。。。从…起当myField=@myParam
且myField为Ascii(VARCHAR)且@myParam为Unicode(NVARCHAR)时,执行必须进行表扫描,不能在myField上使用索引,与SSMS执行相比,会导致性能不理想


正如我所说的,这只是一个在黑暗中拍摄的镜头,但这是一个常见的陷阱,调试起来相当微妙。

尝试以下内容,也许这会澄清发生了什么:

  • 在sql profiler中,捕获复杂sql语句转换成的确切语句,并在ViualStudio中运行它

  • 当所讨论的sql语句正在运行时,请转到ManagementStudio。它可以给你一个想法,什么可能会阻止sql

  • 重要的是要同时看到还有什么在运行。应用程序是多线程的吗?sql连接是否在使用后立即关闭/释放(如果没有,可能不会及时关闭)?多个线程是否使用相同的sql连接


  • 无论我是否在管理工作室,锁定不会发生吗?我在ManagementStudio中多次运行该查询;它从不超时。对于SqlDataSource,它总是这样。或者,是否有某种设置迫使SqlDataSource始终等待锁定,而management Studio根本不这样做?@Stefan,请编辑您的问题,说明从SqlDataSource运行时总是超时,但从management Studio运行时从不超时,这是一条重要线索。我喜欢在黑暗中拍摄,这是一条非常有说服力的线索。我确实在SqlDataSource上设置了SelectParameters的DbType/类型,但这没有帮助。另外,请注意SqlDataSource并不总是超时;仅针对某些参数。如果1000%的人确信(不,额外的0不是打字错误)SSMS和ADO.Net中的查询是相同的,那么应该比较执行计划(探查器可以向您显示ADO.Net语句的图形执行计划,捕获计划XML事件)。如果计划不同(因此不是ADO.Net客户机的不当行为),那么您可以查看设置选项。查看ADO.Net连接和SSMS连接的sys.dm_exec_会话,并对它们进行比较,看看有什么不同,然后检查MSDN以了解不同设置的含义。是的,它们是相同的(从SQL Profiler复制过来)。你是对的。。。这是设定的选项。我更改了“事务隔离级别”,它不再超时。我希望我能把你的和KM的作为答案,因为他也在正确的轨道上。但最终,你最后的评论确实帮助我解决了这个问题,所以请回答你。谢谢