3

SqlCommand.ExecuteReader()我有一个用于从 SQL Server 2008 数据库读取数据的应用程序。当我使用它时,我会得到一个TimeoutException. 设置为 40 秒-CommandTimeout发生异常也需要 40 秒。我也设置IsolationLevelReadUncommitted. 当我直接在 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

当我执行此操作时,我得到了以下异常:

   在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常,布尔 breakConnection)
   在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔 breakConnection)
   在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
   在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader dataStream,BulkCopySimpleResultSet bulkCopyHandler,TdsParserStateObject stateObj)
   在 System.Data.SqlClient.SqlDataReader.SetMetaData(_SqlMetaDataSet metaData, Boolean moreInfo)
   在 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,布尔返回流,布尔异步)
   在 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.ExecuteDbDataReader(CommandBehavior 行为)
   在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()

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

4

2 回答 2

2

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

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

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

于 2013-09-15T11:40:53.227 回答
0

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

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

我添加connection.Dispose()到查询的末尾,一切正常。

于 2016-12-01T07:33:07.073 回答