Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/21.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#获取TransactionScope事务中的当前连接_C#_.net_Sql Server 2005_Transactions_Transactionscope - Fatal编程技术网

c#获取TransactionScope事务中的当前连接

c#获取TransactionScope事务中的当前连接,c#,.net,sql-server-2005,transactions,transactionscope,C#,.net,Sql Server 2005,Transactions,Transactionscope,我想在.NET2.0项目中进行一系列事务性sp调用(SQLServer2005),该项目使用 using(TransactionScope...) 不幸的是,我从另一个项目继承了DAL,我不想在那里做太多更改。问题是每个调用存储过程的方法都会打开一个新连接 所以,我的问题是:有没有一种方法可以检索当前事务使用的连接,即从transaction.current 多谢各位 美国 更新:请告诉我此控制台应用程序(vs2005、.net 2.0、Sql server 2005)有什么问题 除非您出于某

我想在.NET2.0项目中进行一系列事务性sp调用(SQLServer2005),该项目使用

using(TransactionScope...)
不幸的是,我从另一个项目继承了DAL,我不想在那里做太多更改。问题是每个调用存储过程的方法都会打开一个新连接

所以,我的问题是:有没有一种方法可以检索当前事务使用的连接,即从transaction.current

多谢各位

美国

更新:请告诉我此控制台应用程序(vs2005、.net 2.0、Sql server 2005)有什么问题


除非您出于某种原因不使用连接池,否则没有什么好的理由不创建一个新的SqlConnection并进城。让运行时来处理实现该性能的细节——这就是连接池的用途。听起来DAL写得很正确:

...
using (var conn = new SqlConnection("connection string"))
{
    using (var cmd = conn.CreateCommand())
    {
        conn.Open();
        //Do stuff with cmd
    }
}
....

即使您没有使用连接池(并且您有一个不使用连接池的正当理由),最好的方法可能仍然是新建一个SqlConnection并进城。您不希望意外地执行诸如关闭事务作用域正在使用的连接之类的操作,这是假设它实际上有一个SqlConnection供您参考。

好的,有几件事:

  • 我甚至怀疑TransactionScope是否有(Sql)连接的概念。原因是它确实可以处理各种事务性资源,无论是数据数据库、消息队列系统还是其他什么。有关详细信息,请参阅。所以,我猜你的方法注定要失败

  • 在您的示例中,您缺少对的“ts.Complete()”调用,因此当使用范围结束时,(分布式)事务将始终回滚。现在,这与您描述的问题无关,但值得指出

  • 您的环境事务(与TransactionScope实例相似)被传播到分布式事务,因为您在其中使用多个连接。因此,本质上,系统上的DTC需要与数据库服务器上的DTC对话。要使其工作,必须正确配置这两个组件

  • 要配置DTC,请通过执行
    C:\Windows\System32\com\comexp.msc
    运行“组件服务”管理控制台。在树视图中导航到“组件服务\计算机\我的计算机”。在关联菜单中打开“属性”。在Properties对话框中选择“MSDTC”选项卡,在其上单击“安全配置…”按钮

    在对话框中,确保选择了以下选项:

    • “网络故障诊断码访问”
    • “允许远程客户端”
    • “允许入站”
    • “允许出站”
    • “启用事务Internet协议(TIP)事务”
    • “启用XA事务”
    (注:YMMV,其中一些可能实际上并不必要)

    根据您当地的政策/要求,您可能还希望设置为“无需身份验证”


    您需要在两个系统上都执行此操作:一个是运行应用程序的系统,另一个是带有数据库的系统。

    好的,谢谢大家。。最后,我结束了编写类似Microsoft.Practices.EnterpriseLibrary.Data.TransactionScopeConnections的内容,您可以在Enterprise Library()中找到它。…

    如果您在TransactionScope中,您可以创建自己的连接,它将(我相信)自动登记到范围中。这就是您试图避免的吗?是的,DAL中的每个方法都在表示一个新的SqlConnection(“querystring..”),打开()并在SqlCommand中使用它。。可能问题是每个方法也在Dispose()或Close()处理它!因此,您正试图获得TransactionScope本身用于与数据库通信的连接?没错。。或者我必须编写某种连接持有者的代码,比如ms enterprise library数据访问应用程序块中的连接持有者。好的,我用我用来测试它的代码编辑了这个问题。。当它第二次尝试连接.Open()时,出现异常“分布式事务管理器(MSDTC)的网络访问已被禁用…”您是连接到远程数据库服务器还是本地计算机上的实例?它是远程服务器。。Microsoft SQL Server标准版,版本9.00.4035.00您必须完成DTC设置过程,以确保DTC能够管理web服务器与SQL Server之间的事务。这涉及到一些操作系统设置,可能还有防火墙设置,但google上有很多有用的信息。今天早上我在.net 3.5和sqlserver2008上尝试了相同的代码,其行为与我最初的预期相同:在同一事务中登记了两个独立的连接,而没有升级到分发事务。。我认为对TransactionScope问题最完整的答案是:好的,谢谢你。。我将进行一些重构,以跟踪TransactionScope中的单个SqlConnection。。
    ...
    using (var conn = new SqlConnection("connection string"))
    {
        using (var cmd = conn.CreateCommand())
        {
            conn.Open();
            //Do stuff with cmd
        }
    }
    ....