1

以下のコードで CommandTimeout を機能させることができないようです。動作を確認するためだけにタイムアウト値を 1 秒に設定しましたが、無視されているようです。SELECT ステートメントの実行には約 15 秒かかり、完了するまで実行されます。1 秒後にタイムアウト例外が発生することを期待しています。これを行う方法の例を見つけるためにインターネットを検索しましたが、何も見つかりませんでした。私は何を間違っていますか?

DbProviderFactory factory = DbProviderFactories.GetFactory("System.Data.SqlClient");
DataSet dataSet = new DataSet();
DbCommand command = factory.CreateCommand();
command.Connection = factory.CreateConnection();
command.Connection.ConnectionString = "Server=localhost;Database=MyDatabase;User Id=;Password=****";
command.CommandType = CommandType.Text;
command.CommandText = "SELECT * FROM table";
command.CommandTimeout = 1;

using (DbDataAdapter adapter = factory.CreateDataAdapter())
{
    adapter.SelectCommand = command;
    adapter.Fill(dataSet);
}


更新: 実行に 30 秒以上かかる SELECT コマンドを作成しました。これもタイムアウトしません。CommandTimeout 行もコメントアウトしましたが、それでも完了まで実行されました。そのため、デフォルトの CommandTimeout である 30 秒も無視されているようです。私は困惑しています...どんな助けでも大歓迎です。


更新: 私はそれを理解したかもしれないと思います。非常に複雑な SELECT ステートメントを記述したときに、コマンド タイムアウト例外が発生したようです。単純な SELECT コマンドを使用すると、コマンドの実行に 1 秒もかからず、データ セットのロードにさらに 15 秒かかるということで何が起こっているのかを推測することしかできません。私はここで正しい軌道に乗っていますか?これはありそうですか?

4

1 に答える 1

0

コマンド タイムアウトは、コマンドの実行中または結果の処理中のすべてのネットワーク読み取りに対する (メソッドの呼び出し中に読み取られるすべてのネットワーク パケットの) 累積タイムアウトです。最初の行が返された後もタイムアウトが発生する可能性があり、ユーザーの処理時間は含まれず、ネットワークの読み取り時間のみが含まれます。

たとえば、タイムアウトが 30 秒の場合、読み取りに 2 つのネットワーク パケットが必要な場合、両方のネットワーク パケットを読み取るのに 30 秒かかります。Read をもう一度呼び出すと、必要なデータを読み取るためにさらに 30 秒かかります。

注:
コマンドがコンテキスト接続 (接続文字列で "context connection=true" で開かれた SqlConnection) に対して実行される場合、または BeginExecuteReader などの非同期メソッド呼び出し中に使用される場合、CommandTimeout は効果がありません。

于 2015-04-14T07:06:50.030 に答える