与SMO连接共享事务

时间:2013-04-29 06:54:20

标签: .net smo

如何与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要求命令具有事务

1 个答案:

答案 0 :(得分: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 ")

我希望这可能会对你有所帮助,即使这个问题很老......