2013-04-29 74 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 ") 

我希望這可以幫助你,儘管這個問題是很老...