来自 dotnet 的带有事务的 SQL 脚本

ben*_*rce 2 .net sql sql-server ado.net transactions

我一直在尝试从 dotnet (C#) 执行 sql 脚本,但 sql 脚本可能包含 GO 语句,我希望能够将脚本集合包装在事务中。

我发现了这个问题,接受的答案让我开始处理 GO 语句,但是如果我使用 BeginTransaction,它会在“new ServerConnection”行抛出InvalidOperationException 。

SqlConnection connection = new SqlConnection(connectionString);
connection.Open();
SqlTransaction transaction = connection.BeginTransaction(transactionName);
ServerConnection serverConnection = new ServerConnection(connection);
Run Code Online (Sandbox Code Playgroud)

我正在 SQL 2005 服务器上运行它。

Jup*_*aol 5

我找到了一种方法,在尝试了几种组合后,最简单的一种有效......

好吧,这是假设您正在使用一个TransactionScope对象

using (
    var transactionScope = new TransactionScope(TransactionScopeOption.Required,
                                                new TransactionOptions
                                                    {
                                                        IsolationLevel =
                                                            IsolationLevel.ReadCommitted,
                                                        Timeout = TimeSpan.FromMinutes(300)
                                                    }))
{
    sqlServerInstance.ConnectionContext.SqlExecutionModes = SqlExecutionModes.ExecuteAndCaptureSql;
    sqlServerInstance.ConnectionContext.StatementTimeout = int.MaxValue;

    //This line makes the MAGIC happen =)
    sqlServerInstance.ConnectionContext.SqlConnectionObject.EnlistTransaction(Transaction.Current);
    sqlServerInstance.ConnectionContext.ExecuteNonQuery(scriptContent);
}
Run Code Online (Sandbox Code Playgroud)