Мне нужно переместить код из старого проекта в новый. Старый проект использует DLL с хранимыми процедурами (32-разрядная версия), но мне нужна эта DLL на 64-разрядном SQL Server, поэтому мне нужно переписать эти процедуры.«Ошибка MS DTC отменила распределенную транзакцию» в хранимой процедуре SQLCLR
Я пишу DLL с помощью хранимых процедур для SQL Server 2008. В 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, она работает. Но в старом проекте возникает ошибка:
The Microsoft Distributed Transaction Coordinator (MS DTC) has cancelled the distributed transaction.
Служба MSDTC запускается, и я задал все параметры безопасности. Как это исправить? Возможно, есть и другие способы запуска удаленных хранимых процедур (связанный сервер), но мне нужно сохранить старые функциональные возможности проекта.
DTC участвует в * транзакциях * Отправьте код, который * начинает * транзакцию. Ваша хранимая процедура делает что-то действительно злобное - она открывает сервер * new connection *, что означает, что любые существующие транзакции, запущенные вашим кодом, должны будут перерасти в распределенные транзакции с использованием DTC. Почему вы просто не создали связанный сервер и не вызвали удаленную процедуру напрямую? Чтобы запустить этот код, вам также пришлось избавиться от безопасности SQLCLR. –