2013-04-29 77 views
1

如何与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要求该命令在分配给命令的连接处于待处理本地事务中时进行事务处理

回答

2

我面临同样的问题,无法使其工作。

我的解决方法是使用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 ") 

我希望这可以帮助你,尽管这个问题是很老...