2010-11-19 93 views
4

我最近開始使用現有項目,它可以與Microsoft.Practices.EnterpriseLibrary.Data對象一起使用。Microsoft.Practices.EnterpriseLibrary.Data:在一個事務中執行多個語句

現在我想在一個事務中執行多個存儲過程(1:N插入其必須全部失敗或成功)

但我不知道如何....

誰能幫助我出去了?

典型的代碼在這個項目執行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 2010-11-19 08:50:54

+0

,鏈接中的頁面顯示這是'Retired Content'。這個版本的entlib(或整個entlib?)不再被支持嗎? – Michel 2010-11-19 08:51:29

+0

沒有問題 - 讓我們知道你如何繼續。 – RPM1984 2010-11-19 08:51:40

0

你可以換一個TransactionScope內的電話,請參閱:http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx

+0

是的,但這是常規的ADO.NET - 使用企業庫時,應該使用企業庫對象,其中'DbTransaction'是一個。不能相信人們仍然使用企業庫BTW。 – RPM1984 2010-11-19 08:51:14

+3

Bzzt!錯誤的答案! DbTransaction不是一個Entlib對象,它是一個ADO.NET對象。現在最好的方法是使用TransactionScope;它被整合到框架的更多部分中,並且它隱含着自然意味着更容易。從Entlib 3開始,Entlib完全支持TransactionScope。 – 2010-11-19 18:53:36

1

事務範圍不是線程安全的,但。你不能將它用於多線程應用程序是我讀過的。這是一個真正的PITA整體。 MS似乎還不知道如何充分擴展軟件系統。

相關問題