为什么简单选择会出现超时

时间:2013-09-15 11:32:10

标签: c# sql sql-server sqlexception

我有一个使用SqlCommand.ExecuteReader()从SQL Server 2008数据库中读取数据的应用程序。当我使用它时,我会得到一个TimeoutExceptionCommandTimeout设置为40秒 - 在异常发生之前也需要40秒。我还将IsolationLevel设置为ReadUncommitted。 当我直接在SQL Server Management Studio中执行查询时,它将快速执行(1s)而没有任何问题。

查询相对简单:

select TOP (50)  * 
from ActivityView('de') a 
where IsTrashed = 0 and 
   (Subject Like '%' and 
            (a.InchargeId = 'e9584e24-090a-4ef3-a048-330399bfb1b0' or a.PrivilegeLevelId in ('eb39d6bf-4904-4b8d-942f-39463c5d3c3f') or 
            (select top 1 Id from ActivityContact x where x.ActivityId = a.Id and x.UserId = '61423b82-bd6a-4381-808a-6df42f02ab59' ) is not null)) 
 order by a.[Key] desc

当我执行此操作时,我得到了一个例外:

   at System.Data.SqlClient.SqlConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.SqlInternalConnection.OnError(SqlException exception, Boolean breakConnection)
   at System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.SetMetaData(_SqlMetaDataSet metaData, Boolean moreInfo)
   at System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior, SqlCommand cmdHandler, SqlDataReader dataStream, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
   at System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
   at System.Data.SqlClient.SqlDataReader.get_MetaData()
   at System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
   at System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, Boolean async)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result)
   at System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method)
   at System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior)
   at System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()

但是,当我直接在SQL Server Management Studio中执行语句时,它运行正常,没有错误。

2 个答案:

答案 0 :(得分:2)

由于您的SQL命令是根据用户选择的过滤器构建的,因此您需要根据这些选择生成更有效的SQL命令

因此,如果用户未选择Subject,请不要使用Subject Like '%',只是不要在查询中包含该内容。请记住,表中的任何记录都将匹配该条件,而LIKE运算符非常耗时

将这个想法(仅包含具有某些条件的过滤器)应用于您的命令可以拥有的所有可用过滤器。

答案 1 :(得分:0)

对我来说,TimeOut Exception的原因很奇怪。

每次执行查询时,我都会创建并打开SqlConnection。但是,我不会在查询结束时调用connection.Dispose()(尽管我调用connection.Close())。当我重新启动SQL Server实例服务时,错误消失,但在几次执行后,错误又重新出现。

我在查询结束时添加了connection.Dispose(),一切正常。