3

SqlCommand.ExecuteReader()SQL Server 2008 データベースからデータを読み取るために使用するアプリケーションがあります。これを使用すると、 が得られますTimeoutException。はCommandTimeout40 秒に設定されています。例外が発生するまでにも 40 秒かかります。も に設定しIsolationLevelましたReadUncommitted。SQL Server Management Studio でクエリを直接実行すると、問題なく高速 (1 秒) で実行されます。

クエリは比較的単純です。

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、ブール値の 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、ブール値 returnStream、ブール値 async) で
   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

0

私にとって、TimeOut Exception の原因は非常に奇妙です。

SqlConnectionクエリが実行されるたびに を作成して開きます。connection.Dispose()ただし、クエリの最後では呼び出しません(呼び出しますがconnection.Close())。SQL Server インスタンス サービスを再起動するとエラーは消えますが、数回実行するとエラーが再び発生します。

connection.Dispose()クエリの最後に追加したところ、すべて正常に機能しました。

于 2016-12-01T07:33:07.073 に答える