C# 为什么在一个简单的选择中会有一个超时

C# 为什么在一个简单的选择中会有一个超时,c#,sql,sql-server,sqlexception,C#,Sql,Sql Server,Sqlexception,我有一个应用程序,它使用SqlCommand.ExecuteReader从SQL Server 2008数据库读取数据。当我使用这个时,我会得到一个TimeoutException。CommandTimeout设置为40秒-异常发生前也需要40秒。我还将IsolationLevel设置为ReadUncommitted。 当我直接在SQLServerManagementStudio中执行查询时,它将在1s内快速执行,不会出现任何问题 查询相对简单: 选择前50名* 从ActivityView“de

我有一个应用程序,它使用SqlCommand.ExecuteReader从SQL Server 2008数据库读取数据。当我使用这个时,我会得到一个TimeoutException。CommandTimeout设置为40秒-异常发生前也需要40秒。我还将IsolationLevel设置为ReadUncommitted。 当我直接在SQLServerManagementStudio中执行查询时,它将在1s内快速执行,不会出现任何问题

查询相对简单:

选择前50名* 从ActivityView“de”a 其中IsTrashed=0和 主题“%”和 a、 InchargeId='e9584e24-090a-4ef3-a048-3303999BFB1B0'或'eb39d6bf-4904-4b8d-942f-39463c5d3c3f'中的a.PrivilegelvelId;或 从ActivityContact x中选择前1个Id,其中x.ActivityId=a.Id和x.UserId='61423b82-bd6a-4381-808a-6df42f02ab59'不为空 按[键]说明订购 当我执行此操作时,我会得到休止异常:

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中执行这些语句时,它工作得非常完美,没有错误。

因为您有一个SQL命令,它是根据用户选择的过滤器构造的,所以您需要根据这些选择生成一个更有效的SQL命令

因此,如果用户未选择主题,请不要使用“%”之类的主题,只是不要将其包含在查询中。请记住,表中的任何记录都将匹配该条件,并且LIKE运算符非常耗时


将这个想法应用到命令可以拥有的所有可能的过滤器中,只包括具有某些条件的过滤器。

对于我来说,超时异常的原因非常奇怪

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


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

Hi Mauricio-查询中有“%”这样的主题,因为用户没有提供搜索值-我想sql server优化器会删除它吗?是的,SQL命令基于用户筛选器-可以有多个作为一个值PrivilegeLevelId@ThomasKehl我已经根据你的评论更新了我的答案。基本上,如果用户没有为筛选器选择任何条件,请不要将其包含在您的查询中。因此,问题或堆栈跟踪中没有LINQ to SQL。@siride感谢您指出,如果您有答案,请随时发布itA。这取决于函数ActivityView'de'的功能。从ActivityView'de'中选择*是否也会超时?我还没有测试过这个。但为什么我的应用程序会超时,为什么它直接在Management Studio中非常快我的意思是,超时发生在sql server上执行命令之后,而在40秒后不会返回。执行的这一部分与管理工作室的不一样吗?ActivityView“de”是一个简单的视图,它使用“de”作为连接的一部分。很抱歉,您正在使用GUID作为ID。在您的数据库中,这些GUID是存储为UniqueIdentifier还是存储为字符串varchar、char、nvarchar等。?如果是,并且您正在使用参数化查询和传入Guid对象,那么您可能会得到一个比特,它将datatable中的文本提升为uniqueidentifier,而不使用索引。