SMO.Server ConnectionContext 中的事务无法达到致命严重程度
Transactions in SMO.Server ConnectionContext not working for fatal severity
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));
server.ConnectionContext.BeginTransaction();
server.ConnectionContext.ExecuteNonQuery(script);
server.ConnectionContext.CommitTransaction();
}
catch { server.ConnectionContext.RollBackTransaction(); }
finally { connection?.Dispose(); }
}
}
}
代码运行完美,除了错误是 fatal。
致命的意思是:
当在 Test.sql 内时,有:
insert into TestTable (result) values ('transaction commited')
raiserror('tset', 17, -1) with log
有效 - 事务已回滚,TestTable 中没有新内容
但是在 Test.sql 里面是致命错误 (20):
insert into TestTable (result) values ('transaction commited')
raiserror('tset', 20, -1) with log
插入正在提交到数据库,就像没有事务一样。
这是问题 How to use transactions in SMO.Server ConnectionContext 的衍生问题,在该问题中我在脚本中出现了致命错误,并认为交易根本无法正常工作。
问题:如何让这段代码处理致命错误?
谢谢。
问题是致命错误应该终止进程,从而终止连接。由于 XACT_ABORT 未设置为 ON,因此行为与描述的一样(尽管很奇怪,我宁愿交易挂起..)。在脚本开头设置 SET XACT_ABORT ON 可以解决这个问题。参考文献:
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));
server.ConnectionContext.BeginTransaction();
server.ConnectionContext.ExecuteNonQuery(script);
server.ConnectionContext.CommitTransaction();
}
catch { server.ConnectionContext.RollBackTransaction(); }
finally { connection?.Dispose(); }
}
}
}
代码运行完美,除了错误是 fatal。
致命的意思是: 当在 Test.sql 内时,有:
insert into TestTable (result) values ('transaction commited')
raiserror('tset', 17, -1) with log
有效 - 事务已回滚,TestTable 中没有新内容
但是在 Test.sql 里面是致命错误 (20):
insert into TestTable (result) values ('transaction commited')
raiserror('tset', 20, -1) with log
插入正在提交到数据库,就像没有事务一样。
这是问题 How to use transactions in SMO.Server ConnectionContext 的衍生问题,在该问题中我在脚本中出现了致命错误,并认为交易根本无法正常工作。
问题:如何让这段代码处理致命错误? 谢谢。
问题是致命错误应该终止进程,从而终止连接。由于 XACT_ABORT 未设置为 ON,因此行为与描述的一样(尽管很奇怪,我宁愿交易挂起..)。在脚本开头设置 SET XACT_ABORT ON 可以解决这个问题。参考文献: