3

如何与 SMO 服务器连接共享事务?共享连接就像

var connection = new SqlConnection();
var serverConnection = new ServerConnection(connection);
var server = new Server(serverConnection);

但是如果连接已经有Transaction它自己的存在,

var connection = new SqlConnection();
connection.BeginTransaction();

当我开始使用服务器对象时

var database = server.Databases[connection.Database];

这被抛出:

当分配给命令的连接处于挂起的本地事务中时,ExecuteNonQuery 要求命令具有事务

4

1 回答 1

3

我遇到了同样的问题,也无法让它工作。

我的解决方法是使用 SQL 创建事务。这允许我在 SMO 和 ADO.NET 中使用相同的连接和事务。

Dim srvcn As New ServerConnection(sqlcn)
Dim srv As New Server(srvcn)

Dim sql As String = "SET CONCAT_NULL_YIELDS_NULL, ANSI_NULLS, ANSI_PADDING, QUOTED_IDENTIFIER, ANSI_WARNINGS, ARITHABORT, XACT_ABORT ON " & vbCrLf & _
                    "SET NUMERIC_ROUNDABORT, IMPLICIT_TRANSACTIONS, NOEXEC OFF " & vbCrLf & _
                    "GO " & vbCrLf & _
                    "SET TRANSACTION ISOLATION LEVEL SERIALIZABLE " & vbCrLf & _
                    "GO " & vbCrLf & _
                    "BEGIN TRANSACTION" & vbCrLf & _
                    "GO "

srv.ConnectionContext.ExecuteNonQuery(sql)

完成事务也是通过纯 SQL 完成的:

srv.ConnectionContext.ExecuteNonQuery("IF @@TRANCOUNT>0 COMMIT TRANSACTION " & vbCrLf & _
                                      "GO " & vbCrLf & _
                                      "SET NOEXEC OFF " & vbCrLf & _
                                      "GO ")

我希望这可以帮助你,即使这个问题已经很老了......

于 2014-09-18T09:26:51.603 回答