2012-02-24 116 views
11

SqlCommandクエリのタイムアウトを変更しようとしています。特定の接続文字列の接続をテストするメソッドです。コードは次のようになります。CommandTimeoutが機能しない

using (SqlConnection connection = new SqlConnection(connectionString)) 
    { 
     SqlCommand cmd = new SqlCommand("SELECT ...", connection); 
     cmd.CommandTimeout = 10; 
     connection.Open(); 
     SqlDataReader reader = cmd.ExecuteReader(); 
     ... 
     connection.Close(); 
    } 

私はちょうどこの接続文字列が大丈夫かどうかをテストしたいので、私は、ここに短いタイムアウトを持っていると思います。 しかし、私がCommandTimeoutに何を設定しても(私は0,1,2,4,10,30,60,120を試しました)、私のダミー接続文字列のリアルタイムは常にほぼ同じです(合計実行時間は約15秒)。

CommandTimeoutで設定した値が何らかの理由で無視されているようです。

なぜでしょうか?

+0

ないアイデアが、http://msdn.microsoft.com/en-us/library/systemでMSDNのDOCO。 data.sqlclient.sqlcommand.commandtimeout.aspxには、無視される理由がいくつか記載されています。 1つは非同期的に使用され、あなたの問題ではないBeginExecuteReaderを使用しています。しかし、もう1つは、コンテキスト接続(SqlConnectionが接続文字列で "context connection = true"で開かれている)に対してコマンドが実行されたときのタイムアウトを意味しません。接続文字列が原因であるかどうか確認してください。 –

+0

はい、ドキュメントを数回チェックして、そこに何か不足していないことを確認しました。とにかく、非同期リーダーでもなく、接続文字列もありません。 –

+0

質問には関係ありませんが、 "使用中"のブロックを利用しているので、connection.Close()を使用する必要はありません。使用ブロックのスコープの終わりとして自動的に閉じて接続を終了します。 – dotnetguy

答えて

5

正確にはSqlCommand.CommandTimeoutが何であるか混乱していると思います。

取得またはコマンドを実行するための試行を終了してエラーを生成するまでの待機時間を設定します:this MSDN referenceあたりとおり。

あなたのケースでは、DataReaderを実行していて、クエリをステップ実行しています。それぞれがRead()のために最小限の時間を費やしているため、あなたのタイムアウトを打つことはできません。

編集

間違った接続文字列を使用している場合は、あなたのTimeoutは、コマンドのタイムアウトではありませんが、それは接続時間になるでしょう。デフォルトは15秒です。それはあなたの状況に有効なタイムアウトです。

SqlConnection.Open()というメソッド呼び出しでタイムアウトする場合は、SqlCommand.ExecuteReader()ではなくタイムアウトになります。したがって、ConnectionTimeoutプロパティは有効なタイムアウト値になります。

SqlConnection.ConnectionTimeout Property MSDN Reference

+0

ポイントは、as私は質問で、私は間違った接続文字列でこれをテストしているので、私は実際に何かを読むことはできません。そのため、私は実行時間がタイムアウト時間だけになると思っていました。 –

+0

@ FlavioIvan Ah、ok。そうですか。私の編集を見てください。あなたの 'SqlCommand.CommandTimeout'は、悪い接続でタイムアウトのために使われるものではありません。これは 'SqlConnection.ConnectionTimeout'プロパティになります。 –

+0

ありがとう、サメ!私はちょうどそれをテストし、今実行時間が変わるのを見ます。それは私が設定したタイムアウト時間よりも実行にはまだ多くの時間がかかっていますが、今ではそれを使って遊ぶことができます。 :) –

1

また、デフォルトの15秒を持っている接続タイムアウトをチェックする必要があります。

またhttp://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqlcommand.commandtimeout.aspxを参照してください - あなたの接続文字列は、コンテキストその後、CommandTimeoutのが

+0

申し訳ありませんが、その質問に言及を忘れていましたが、私は私の接続文字列のコンテキストを持っていません。 –

+0

"デフォルトの15秒の接続タイムアウトを確認する必要もあります。 +1 –

0

また、あなたの設定ファイル内の接続文字列でこれを指定することができます。

<connectionStrings> 
    <add name="*con_name*" connectionString="data source=*dsource*;initial catalog=*catalog*;integrated security=True;Connect Timeout=300;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
</connectionStrings> 
関連する問題