C# Microsoft.Practices.EnterpriseLibrary.Data:在一个事务中执行多个语句
我最近开始了一个现有的项目,它与Microsoft.Practices.EnterpriseLibrary.Data对象一起工作 现在我想在一个事务中执行多个存储过程(1:n insert,必须全部失败或成功) 但我不知道怎么 有人能帮我吗 在此项目中执行sp的典型代码如下所示:C# Microsoft.Practices.EnterpriseLibrary.Data:在一个事务中执行多个语句,c#,ado.net,enterprise-library,C#,Ado.net,Enterprise Library,我最近开始了一个现有的项目,它与Microsoft.Practices.EnterpriseLibrary.Data对象一起工作 现在我想在一个事务中执行多个存储过程(1:n insert,必须全部失败或成功) 但我不知道怎么 有人能帮我吗 在此项目中执行sp的典型代码如下所示: Database oDatabase = DatabaseFactory.CreateDatabase(CONNECTION_STRING_KEY); DbCommand oDbCommand = oDatabase.
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);
您需要使用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;
}
}
请注意ExecuteOnQuery的第一个参数是如何使用事务的
更多信息。您可以将调用包装在transactionscope中,请参阅:尽管事务作用域不是线程安全的。我读到的是,你不能将它用于多线程应用程序。这是一个真正的皮塔整体。MS似乎仍然不了解如何充分扩展软件系统。是的,但这是常规的ADO.NET-在使用企业库时,应该使用企业库对象,其中
DbTransaction
就是其中之一。真不敢相信人们还在使用企业图书馆!回答错了!DbTransaction不是Entlib对象,它是ADO.NET对象。现在最好的方法是使用TransactionScope;它被集成到框架的更多部分中,它的隐式特性意味着它更容易实现。从Entlib 3开始,Entlib完全支持TransactionScope。顺便说一句,链接中的页面显示:“失效内容”。这个版本的entlib(或整个entlib?)不再受支持了吗?没问题-让我们知道你的进展。entlib仍然受支持,但那个特定的版本(3.1)已经过时了。我们去年5月刚发布了5.0版。当前的文档页面在这里:虽然没有什么不同。顺便说一下,我强烈建议现在使用TransactionScope而不是显式事务。它更易于管理,更易于组合。