6

ADO.Net + C# + VSTS 2008 + ADO.Net を使用して SQL Server 2008 Enterprise に接続しています。ここで説明したほぼ同じパターン/サンプルを使用しています。ADO.Net DataReader を使用して、1 つのエントリ (行) ごとにデータを取得します。

http://msdn.microsoft.com/en-us/library/haa3afyz.aspx

私の質問は、このサンプルで SqlCommand タイムアウトを設定した場合、1 です。タイムアウトは、エントリごとのデータ全体の合計タイムアウトではなく、1 つの特定の行を取得するために最大値として使用できる時間に適用されると思いますループ?

ところで:ループつまり、

while (reader.Read())
{
    Console.WriteLine("{0}\t{1}", reader.GetInt32(0),
        reader.GetString(1));
}

2. このタイムアウトは、データベースからデータ エントリを取得するのにかかる時間のみが重要であり、このタイムアウトは、各エントリを処理する時間とは何の関係もありません (たとえば、タイムアウトを 20 秒に設定し、1 秒かかる場合)データベースから 1 つのデータ エントリを取得するのに 1 秒かかり、アプリケーション ロジックがデータ エントリを操作するのに 30 秒かかります。タイムアウトは発生しません)。

正しい理解?

4

2 に答える 2

10

設定できるコマンド タイムアウトは、ADO.NET にジョブを実行させる時間に適用されます。

何も返さずに SQL ステートメントを実行する呼び出しcmdQuery.ExecuteNonQuery()を行うと、そのステートメントを実行するのに必要な時間になります。

whichを呼び出すcmdQuery.ExecuteReader()と、データ リーダーが返されます。これは、ADO.NET がそのデータ リーダーを起動/構築して、それを使用できるようにするのに必要な時間です。

単一のスカラー値を返すを呼び出す場合cmdQuery.ExecuteScalar()、クエリを実行してその単一の結果を取得するのに必要な時間です。

を使用しdataAdapter.Fill()てデータ テーブルまたはデータ セットを埋める場合、ADO.NET がデータを取得してからデータ テーブルまたはデータ セットを埋めるのに必要な時間です。

つまり、全体的に: タイムアウトは、ADO.NET が実行できるジョブの部分 (ステートメントの実行、データ セットへの入力、スカラー値の返し) に適用されます。

もちろん、結果を繰り返し処理するのにかかる時間には適用されませ(データリーダーの場合)。それはまったく意味がないでしょう...

マルク

于 2009-09-27T18:36:42.310 に答える
2

はい、あなたは正しいです。CommandTimeout は、データベースがコマンド (任意のコマンド) を実行するために必要な時間を意味します。

于 2009-09-27T17:39:39.973 に答える