2017-11-09 4 views
0

以下の例12は、私は次のように書きました。コマンドが実行され、エラーが発生した場合、前のすべてがすでにデータベースに格納されています。ここで取引をするには?SMO.ServerのConnectionContextでトランザクションを使用する方法

[EDIT] 私はこのようにSqlConnectionオブジェクトレベルでトランザクションを開くために、コードを変更する(here何の違いがあってはならないことを、提案しています):

SqlTransaction transaction = null; 
    try 
    { 
     connection = new SqlConnection(sqlConnectionString); 
     server = new Server(new ServerConnection(connection)); 
     connection.Open(); 
     transaction = connection.BeginTransaction(); 
     server.ConnectionContext.ExecuteNonQuery(script); 
     transaction.Commit(); 
    } 

それはInvalidOPexceptionをスロー:"ExecuteNonQueryは、コマンドに割り当てられた接続が保留中のローカルトランザクションにある場合、コマンドにトランザクションが必要です。コマンドのTransactionプロパティが初期化されていません。

しかし、コマンドオブジェクトにアクセスできる場所はありません。

+0

ファイルにはどのようなコードがありますか? –

+0

@SeanLange GO文で区切られたテーブルとプロシージャの作成/変更です –

+0

これは失敗します。 GOはSSMSのデフォルトバッチ区切り文字です。 SQL Serverは、その意味を理解していません。 –

答えて

0

私は同じ問題 "ExecuteNonQueryには、コマンドにトランザクションが必要です..."を直面しました。
SqlConnectionではなくServerConnectionのbegin/commitトランザクションを実行するとすべてが機能するようです。

... 
SqlConnection connection = new SqlConnection(sqlConnectionString); 
ServerConnection srvCon = new ServerConnection(connection); 

try 
{ 
    server = new Server(srvCon); 

    srvCon.BeginTransaction(); 
    server.ConnectionContext.ExecuteNonQuery(script); 
    srvCon.CommitTransaction(); 
} 
catch 
{ 
    srvCon.RollBackTransaction(); 
} 
... 
関連する問題