2009-09-27 23 views
6

私はADO.Net + C#+ VSTS 2008 + ADO.Netを使用してSQL Server 2008 Enterpriseに接続しています。私は、ADO.Net DataReaderを使用して、1つのエントリ(行)で1つのエントリ(行)を取得するのとほぼ同じパターン/サンプルをここで使用しています。ADO.Net DataReaderタイムアウトの問題

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

私の質問は、合計、私はこのサンプルでSqlCommandオブジェクトのタイムアウト、 1を設定した場合、私はタイムアウトは、我々は1つのspecifc行を取得するために、最大値として使用することができますどのくらいの時間に適用されると思いますが、ではありません全体のentry-by-entryループのタイムアウト?ところで

:私は意味ループ、

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

2. と、このタイムアウトは唯一それがデータベースからのデータ入力を取得するのにかかるどのくらいの時間が重要、とこのタイムアウトは、我々が扱うどのくらいの時間とは何の関係もありません(たとえば、タイムアウトを20秒に設定した場合、データベースから1つのデータエントリを取得するのに1秒かかる場合、アプリケーションロジックがデータエントリを操作するのに30秒かかるため、タイムアウトは起こりません)。

正しく理解していますか?

答えて

10

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

何も返さずにSQL文を実行するcmdQuery.ExecuteNonQuery()を呼び出すと、その文を実行するのに必要な時間です。

データ・リーダーを返すcmdQuery.ExecuteReader()を呼び出すと、ADO.NETがそのデータ・リーダーをスティル/構築して使用できるようになるまでの時間です。

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

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

全体的に、タイムアウトは、ADO.NETが実行できるジョブの部分に適用されます。文を実行し、データセットを埋め、スカラー値を返します。

もちろんそれは、が(データリーダーの場合には)それはあなたが結果を反復処理するかかる時間には適用されません。それは... DataReaderのSqlCommandオブジェクトのために、私は混乱何

マルク・

+0

Marcさん、ありがとうございます。1. DataReaderのシナリオを意味するのですか?DataReaderインスタンスを受け取ったとき、タイムアウトが効きませんか? 2.もしそうなら、私はDataReaderの前にいくつかのドキュメントを読んでいますが、ADO.Netはストリーミング・フェーズでデータを取得します。つまり、DataReaderの作成時にSQL Serverからすべてのデータが取得されるわけではありません。これが当てはまる場合は、ADO.NetクライアントとSQL Serverサーバー側の間の転送が増えるはずです。しかし、DataReaderが作成された後、タイムアウトがそれ以上影響を与えないと言ったので、それ以上のストリーミング転送のタイムアウトコントロールはありませんか? – George2

+0

私の上記のコメントに対する私の懸念は、クライアントがDataReaderを非常に長く保持していることと、ストリーミングモード(ADO.Netはクライアントがより多くのデータを読み込もうとしているのか、接続は常に維持されます。私はそのような長いライブリーダーがADO.Netからの接続を閉じる/解放させるような動作のタイムアウト制御をしたい。任意のSqlCommand(DataReaderを作成するために使用)タイムアウトは私が探しているものではないようですか?ありがとう。 – George2

+1

あなたは絶対に正しいです。長い間DataReaderを開いたままにしておくと、その同じ時間に基になる接続が開いたままになります。あなたがこれをやめないようにするタイムアウトはありません。あなたがこれをあまりにも長くしないようにするのはあなたの責任です。 –

2

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

+0

を全く意味がありません、我々は、いずれかによって、データ入力1を取得することができますが、他の種類のSqlCommandオブジェクトのために、我々は、一度にデータを取り出します。したがって、DataReaderの場合、タイムアウトは1つのデータエントリにのみ適用され、データエントリ検索ループ全体には適用されません。あなたが確認できたら大丈夫です。 :-) – George2

関連する問題