2011-12-24 28 views
0

は、基本的にはパッチ適用メカニズムここ単一の接続で複数のトランザクションを使用して

のは、私がやっているものです:

  1. オープンSQL接続。
  2. トランザクションを開始します。
  3. ソフトウェアのバージョンのデータベース内のレコードを更新します。
  4. 同じ接続を使用して同じデータベースに対してさらにクエリを実行します。
  5. 15から20 MBのファイルをダウンロードします。
  6. 同じ接続を使用して選択クエリを実行します。
  7. トランザクションをコミットします。
  8. トランザクションを閉じます。

このシーケンスでは、ファイルのダウンロードに時間がかかるため、SQL Connectionというタイムアウトの問題が発生しています。 問題は、ファイルをダウンロードした後にのみトランザクションをコミットできることです。

C#にコードを書きます。使用するデータベースは、ここでSQLCE あるコードの一部です:

SqlCeConnection conn = new SqlCeConnection("ConnectionString"); 

conn.Open(); 
SqlCeTransaction ts = conn.BeginTransaction(); 

//A method call executes all the methods that with parameters 
(string sqlQuery, ref SqlCeConnection conn, SqlCeTransaction ts) 
{ 
SqlCeCommand cmd = new SqlCeCommand(); 
cmd.Connection = conn; 
cmd.Transaction = ts; 
cmd.CommandText = sqlQuery; 
cmd.ExecuteNonQuery(); 
} 

//A method call downloads the file of 15 to 20 MB 

//A method executes a select query that returns the version of the software by using same SQL connection. 

//The above query gives the error of SQl connection timeout 
ts.Commit(); 
conn.Close(); 

いずれかが問題にあなたが手動でタイムアウトを命じる

+1

なぜトランザクション中に大きなファイルをダウンロードしたいのですか?それは私のように単純に思える:それを間違っている...あなたがすることができる何か私は(*にもかかわらず*を働こうとするよりも)良いことになる。 –

+0

これはパッチ機構であると言いましたが、最初はデータベースの更新を行い、バイナリアップデートを適用しています。そして、バイナリアップデートがうまくいけば、データベースの変更をコミットしているだけです。 – Bhushan

+0

関連性が見えません - トランザクション中に大きな(ish)ファイルをダウンロードすることはまだ問題になります。トランザクションの最初の**、* *のファイルをダウンロードしてください。 –

答えて

0

これは私がやったことです。

ファイルをダウンロードしていたメソッドと同じ接続およびトランザクションオブジェクトを渡しました。 その方法では、ファイルがダウンロードされていたループで単純な選択クエリを実行しました。これは、接続とトランザクションをアクティブに保つのに役立ちました。 ここでは、インターネット接続速度が遅い場合でも、SQlクエリが起動され、接続をアクティブに保つたびに、ループごとに影響を与えません。

0

セットを解決するために私を助けることができます。

cmd.CommandTimeout = 180; 

この例では、180秒(3分)にタイムアウトを設定します

+0

インターネットの速度とファイルのサイズによっては、ファイルをダウンロードするのに必要な時間が長くなることがあります。 – Bhushan

+0

このコマンドをタイムアウトに設定しても、動作しません。 – Bhushan

関連する問題