2009-06-02 16 views
5

私はこのような何かを(ClearImportTableとInsertPageはストアドプロシージャです)なコードの部分を持っている:ストアドプロシージャを使用してLINQでトランザクションをSQLに変換する方法を教えてください。

datacontext.ClearImportTable() //Essentially a DELETE FROM table 
for (int i = 1; i < MAX_PAGES; ++i){ 
    datacontext.InsertPage(i); //Inserts data into the table 
} 

は、これは私のコードのやや簡略版ですが、アイデアは、それが挿入する前にテーブルをクリアしていることです記録。唯一の問題は、ClearImportTableの後にエラーが発生した場合、テーブルのすべてのデータが消去されることです。トランザクションにこれをラップする方法はありますか?エラーがあれば、すべてが元の状態に戻されます。例外が発生した場合や使用してブロックがロールバックされて使用してブロック内で行わtransaction.Complete()、その後、すべてを押すことなく残っている場合

using (var transaction = new TransactionScope()) 
{ 
    // do stuff here... 
    transaction.Complete(); 
} 

答えて

9

あなたがトランザクション・スコープを行うことができます。

System.Transactionsアセンブリを参照する必要があります。

+0

MSDTCを使用する必要がありますが、これは必ずしも良い考えではありません。 –

+0

MSDTCは、変換内に複数のlinq datacontextを作成し、それらに対してクエリを実行する場合にのみ必要と考えています。トランザクションスコープ内にdatacontextオブジェクトを1つだけ作成する場合、必須ではありません。 –

+1

MSDTCは、複数のリソースマネージャが関係している場合にのみ必要です。単一のDataContextのみを使用し、単一のSQL Serverインスタンスに接続する限り、軽量トランザクションを使用する必要があります。 – jrista

0

DataContextのTransactionプロパティを設定しますか?

9

上記の「Sailing柔道」として、私はストアドプロシージャを呼び出す必要があるときに大きな成功を収めたTransactionScopeブロックを使用しました。しかし、「トランザクションが疑わしい」と言って例外がスローされた箇所には、私が遭遇した「落とし穴」が1つあります。この問題を回避するために、私はprocにnondeferredメソッドを呼び出して、すぐに結果を評価させる必要がありました。だからではなく、

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc(); 
    transaction.Complete(); 
} 

の私は、この例では...このよう

using (var transaction = new TransactionScope()) 
{ 
    var db = new dbDataContext(); 

    db.StoredProc().ToList(); 
    transaction.Complete(); 
} 

それを呼び出す必要があった、ToListメソッド()は、LINQは、すぐに結果を評価するために引き起こす任意の非遅延の方法である可能性があります。

LINQの遅延(遅延)性質がトランザクションのタイミングでうまくいっていないためですが、これは推測にすぎません。誰かがこれにもっと光を当てることができるなら、それについて聞いてみたいと思います。

関連する問題