Как использовать транзакции в 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();
}
...