2010-11-19 3 views
4

Недавно я начал с существующего проекта и работает с объектами Microsoft.Practices.EnterpriseLibrary.Data.Microsoft.Practices.EnterpriseLibrary.Data: выполнить несколько операторов в одной транзакции

Теперь я хочу, чтобы выполнить несколько хранимых процедур в одной транзакции (1: п вставки, которые должны все терпеть неудачу или успех)

Но я не знаю, как ....

кто может помочь меня?

Типичный код для выполнения зр в этом проекте выглядит следующим образом:

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 - при использовании Enterprise Library вы должны использовать объекты Enterprise Library, из которых 'DbTransaction' является одним. Не могу поверить, что люди все еще используют Enterprise Library BTW. – RPM1984

+3

Bzzt! Неверный ответ! DbTransaction не является объектом Entlib, это объект ADO.NET. В наши дни лучше всего использовать TransactionScope; он интегрирован в другие части структуры, и это неявный характер означает, что это намного проще. Entlib полностью поддерживает TransactionScope от Entlib 3. –

1

сфера действия не поточно хотя. Вы не можете использовать его для многопоточных приложений, это то, что я прочитал. Это настоящий PITA в целом. MS по-прежнему не понимает, как правильно масштабировать программные системы.

Смежные вопросы