Как использовать транзакции в SMO.Server ConnectionContext

Следуя примерам 1, 2 я написал следующее:

using System;
using System.Data.SqlClient;
using System.IO;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Common;

namespace ScriptRunner
{
    class Program
    {
        static void Main(string[] args)
        {
            var script = File.ReadAllText("Test.sql");
            const string sqlConnectionString = @"Data Source=my\ds;
                    Initial Catalog=myic;
                    Connection Timeout=0;
                    Integrated Security=true";
            SqlConnection connection = null;
            Server server = null;
            try
            {
                connection = new SqlConnection(sqlConnectionString);
                server = new Server(new ServerConnection(connection));
                connection.Open();
                server.ConnectionContext.BeginTransaction();
                server.ConnectionContext.ExecuteNonQuery(script);
                server.ConnectionContext.CommitTransaction();
            }
            catch { server.ConnectionContext.RollBackTransaction(); }
            finally { connection?.Dispose(); }
        }
    }
}

Все работает, кроме транзакций. Команда просто запускается, если есть ошибка, все до этого уже есть в базе данных. Как заставить транзакции работать здесь?

[EDIT] Когда я изменяю код, чтобы открыть транзакцию на уровне SqlConnection, вот так ( здесь предлагается, чтобы не было никакой разницы):

    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 команды не было инициализировано".

Тем не менее я не вижу места, где я могу получить доступ к объекту команды.

1 ответ

Я столкнулся с той же проблемой "ExecuteNonQuery требует, чтобы команда имела транзакцию...".
Кажется, что если выполнить транзакцию s tart /commit для ServerConnection, а не для SqlConnection, то все работает.

...
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();
}
...
Другие вопросы по тегам