我有一个 CLR 过程,它打开到服务器的连接,比方说 SERVER2,并获取一些数据,处理它并返回一个表。
[SqlFunction(
DataAccess = DataAccessKind.Read,
FillRowMethodName = "List_FillRow",
TableDefinition = "Date datetime, Quantity int")]
public static IEnumerable ListCount(...)
{
using (SqlConnection con = new SqlConnection(connectionStringToSERVER2))
{ ... }
return list;
}
此 CLR 过程是从在 SERVER1 上运行的 SQL 存储过程运行的。
CREATE PROCEDURE [dbo].[sp_Reports_NumaraSpalariJetWash]
BEGIN
DECLARE curs CURSOR
LOCAL STATIC READ_ONLY FORWARD_ONLY
FOR
SELECT ...
OPEN curs
FETCH NEXT FROM curs
INTO ...;
WHILE @@FETCH_STATUS = 0
BEGIN
INSERT INTO ...
(...)
SELECT Date, Quantity
FROM dbo.ListCount(...)
FETCH NEXT FROM curs
INTO ...;
END
END
我收到错误:"System.Data.SqlClient.SqlException: Transaction context in use by another session."
在结果窗口中,此错误出现多次,我猜每次循环 FETCH 一次.
最佳答案
执行 INSERT...SELECT
应该导致系统生成的事务将 INSERT
和 SELECT
作为原子操作绑定(bind)在一起.从 .NET 4.0 或 4.5 开始,SqlConnection
的默认行为是 Enlist
为 True
而它默认为 False
在 .NET Framework 的早期版本中。当 Enlist
为 True
时,新连接将尝试加入现有事务。
尝试将 Enlist=False;
添加到连接字符串。
有关一般使用 SQLCLR 的更多信息,请访问 SQLCLR.org .
关于c# - 从不同的服务器获取 CLR Procedure 中的数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50451195/