我有一个接口,通过 ODBC 连接触发多个 SQL 查询。
这些查询创建函数、存储过程、执行存储过程等等。
如果其中一个失败,我希望开始一个完整的回滚。
begin transaction
查询 a和 a的简单计划commit transaction
导致 之后出现运行时错误begin transaction
,因为此时没有触发任何提交。
是否有可能在一堆查询周围放置一个事务块?
我有一个接口,通过 ODBC 连接触发多个 SQL 查询。
这些查询创建函数、存储过程、执行存储过程等等。
如果其中一个失败,我希望开始一个完整的回滚。
begin transaction
查询 a和 a的简单计划commit transaction
导致 之后出现运行时错误begin transaction
,因为此时没有触发任何提交。
是否有可能在一堆查询周围放置一个事务块?
是的你可以。我假设您的意思是创建插入或更新类型的 sql 语句(不是选择查询)。在您进行此类操作之前,您应该记住仅当查询与您在查询之间设置的新数据没有关系时才在单个事务中运行查询。这是因为新数据尚未提交,因此您不能在下一条语句中使用 is。
这是一个使用事务运行一组命令的代码。
/// <summary>
/// Execute commands with an open SQL connection.
/// Note: To execute a stored procedure send to useTransaction parameter false value
/// </summary>
/// <param name="connection">An opened SqlConnection</param>
/// <param name="commands">A string array of the requested commands to execute</param>
/// <param name="useTransaction">true if to force transaction, false to execute the commands without transaction</param>
/// <returns>true for success, otherwise false</returns>
public static bool ExecuteSqlCommands(SqlConnection connection, string[] commands, bool useTransaction)
{
bool bStatus = false;
string[] lines = commands; // regex.Split(sql);
SqlTransaction transaction = null;
if (useTransaction)
transaction = connection.BeginTransaction();
using (SqlCommand cmd = connection.CreateCommand())
{
cmd.Connection = connection;
if (useTransaction)
cmd.Transaction = transaction;
foreach (string line in lines)
{
if (line.Length > 0)
{
cmd.CommandText = line;
cmd.CommandType = CommandType.Text;
try
{
cmd.ExecuteNonQuery();
}
catch (SqlException e)
{
string msg = e.Message;
if (useTransaction)
transaction.Rollback();
throw;
}
}
}
bStatus = true;
}
if (bStatus && useTransaction)
transaction.Commit();
return bStatus;
}