Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Microsoft.Practices.EnterpriseLibrary.Data:在一个事务中执行多个语句_C#_Ado.net_Enterprise Library - Fatal编程技术网

C# Microsoft.Practices.EnterpriseLibrary.Data:在一个事务中执行多个语句

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.

我最近开始了一个现有的项目,它与Microsoft.Practices.EnterpriseLibrary.Data对象一起工作

现在我想在一个事务中执行多个存储过程(1:n insert,必须全部失败或成功)

但我不知道怎么

有人能帮我吗

在此项目中执行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);

您需要使用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而不是显式事务。它更易于管理,更易于组合。