c#获取TransactionScope事务中的当前连接
我想在.NET2.0项目中进行一系列事务性sp调用(SQLServer2005),该项目使用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)有什么问题 除非您出于某
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供您参考。好的,有几件事:
C:\Windows\System32\com\comexp.msc
运行“组件服务”管理控制台。在树视图中导航到“组件服务\计算机\我的计算机”。在关联菜单中打开“属性”。在Properties对话框中选择“MSDTC”选项卡,在其上单击“安全配置…”按钮
在对话框中,确保选择了以下选项:
- “网络故障诊断码访问”
- “允许远程客户端”
- “允许入站”
- “允许出站”
- “启用事务Internet协议(TIP)事务”
- “启用XA事务”
您需要在两个系统上都执行此操作:一个是运行应用程序的系统,另一个是带有数据库的系统。好的,谢谢大家。。最后,我结束了编写类似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
}
}
....