2010-11-19 28 views
4

私は最近、既存のプロジェクトで開始し、Microsoft.Practices.EnterpriseLibrary.Dataオブジェクトで動作します。Microsoft.Practices.EnterpriseLibrary.Data:1つのトランザクションで複数のステートメントを実行

今私は(1:nは失敗するか成功している全てに持って挿入する)1つのトランザクションで複数のストアドプロシージャを実行したい

しかし、私は

は誰がどのように役立つか....知りません私は出る?このプロジェクトでは、SPを実行するための

典型的なコードは次のようになります。

Database oDatabase = DatabaseFactory.CreateDatabase(CONNECTION_STRING_KEY); 
DbCommand oDbCommand = oDatabase.GetStoredProcCommand("upCustomer_Insert"); 

Int32 iCustomerKey = 0; 
oDatabase.AddInParameter(oDbCommand, "Firstname", DbType.String, p_oCustomer.FirstName); 
oDatabase.AddInParameter(oDbCommand, "Lastname", DbType.String, p_oCustomer.LastName); 

oDatabase.ExecuteNonQuery(oDbCommand); 

答えて

6

あなたはDbTransactionの使用にする必要があります。

using (DbConnection connection = db.CreateConnection()) 
{ 
    connection.Open(); 
    DbTransaction transaction = connection.BeginTransaction(); 

    try 
    { 
     db.ExecuteNonQuery(transaction, sp1); 
     db.ExecuteNonQuery(transaction, sp2); 
     transaction.Commit(); 
    } 
    catch 
    { 
     transaction.Rollback(); 
     throw; 
    } 
} 

お知らせをどのようには、ExecuteNonQueryへの最初のパラメータは使用するトランザクションです。

詳細情報here

+0

ありがとう、私はそれにショット – Michel

+0

を与えるでしょう、ところで、リンクのページはこれを示しています: 'Retired Content'。このバージョンのentlib(またはentlib全体)はもはやサポートされていませんか? – Michel

+0

問題はありません。あなたがどのように乗っているかをお知らせください。 – RPM1984

0

あなたはのTransactionScope内の呼び出しをラップすることができ、次を参照してください。http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

+0

はい、それは通常のADO.NETです。エンタープライズライブラリを使用する場合は、エンタープライズライブラリオブジェクトを使用する必要があります。そのうちの「DbTransaction」は1つです。人々はまだエンタープライズライブラリBTWを使用していると信じられません。 – RPM1984

+3

Bzzt!間違った答え! DbTransactionはEntlibオブジェクトではなく、ADO.NETオブジェクトです。最近の最善のアプローチはTransactionScopeを使用することです。それはフレームワークのより多くの部分に統合されており、暗黙の性質はそれがはるかに容易であることを意味します。 EntlibはEntlib 3の時点でTransactionScopeを完全にサポートしています。 –

1

トランザクションスコープはいえスレッドセーフではありません。私が読んだのは、マルチスレッドアプリケーションには使えません。これは本当のPITA全体です。 MSはまだソフトウェアシステムを適切に拡張する方法を理解していないようです。

関連する問題