【发布时间】:2016-04-01 09:16:54
【问题描述】:
我需要将一些代码从旧项目移到新项目。旧项目使用带有存储过程(32 位版本)的 DLL,但我在 64 位 SQL Server 上需要这个 DLL,所以我需要重写这些过程。
我正在使用 SQL Server 2008 的存储过程编写 dll。在 Management Studio 中,我加载程序集,然后使用以下方法创建过程:
CREATE PROCEDURE ...
AS EXTERNAL NAME
旧的 DLL 过程只是使用与远程 SQL Server 的新连接在其上运行存储过程并返回结果。
所以在我的过程中,我为远程服务器创建了一个SqlConnection 并在远程服务器上运行存储过程:
using (SqlConnection connection = new SqlConnection(String.Format("User ID={0};Password={1};Persist Security Info=True;Initial Catalog={2};Data Source={3}", Login, Password, DBName, ServerName)))
{
connection.Open();
SqlCommand command = new SqlCommand("Exec ProcName", connection);
SqlDataReader reader = command.ExecuteReader();
SqlContext.Pipe.Send(reader);
}
如果我在 SSMS 中运行此过程,它会起作用。但是在旧项目中它会引发错误:
Microsoft 分布式事务协调器 (MS DTC) 已取消分布式事务。
MSDTC 服务运行,我设置了所有安全参数。如何解决?也许还有其他方法可以运行远程存储过程(链接服务器),但我需要保存旧的项目功能。
【问题讨论】:
-
DTC 涉及事务发布开始事务的代码。您的存储过程做了一些非常邪恶的事情——它打开了一个新连接 服务器,这意味着由您的代码启动的任何现有事务都必须使用 DTC 升级为分布式事务。为什么不直接创建链接服务器并直接调用远程过程?为了运行该代码,您还必须放松 SQLCLR 安全性
标签: c# sql-server sqlclr msdtc