sql-server - 事务中的多个参数化的Delphi SQL更新

标签 sql-server delphi sqlite transactions parameterized

我试图在Delphi XE8中使用参数化查询在同一循环中更新两个不同的SQL表。我还想将整个事情包装在一个事务中,这样,如果循环中的任何事情失败,则不会更新任何表。

我真的不知道自己在做什么,不胜感激。

下面的代码是我要实现的目标的简化版本,也是我最好的猜测。但是我一点也不十分确定,特别是使用两个连接到“ SQL连接”组件的数据集。

SQL_transaction.TransactionID :=1;
SQL_transaction.IsolationLevel:=xilREADCOMMITTED;
SQL_connection.BeginTransaction;
Try
  { Create connections }

  SQL_dataset1              :=TSQLDataSet.Create(nil);  
  SQL_dataset1.SQLConnection:=SQL_connection;

  SQL_dataset2              :=TSQLDataSet.Create(nil);  
  SQL_dataset2.SQLConnection:=SQL_connection;

  { Create queries }

  SQL_dataset1.CommandType:=ctQuery;
  SQL_dataset1.CommandText:={ some parameterized query updating table A }

  SQL_dataset2.CommandType:=ctQuery;
  SQL_dataset2.CommandText:={ some parameterized query updating table B }

  { Populate parameters and execute }

  For I:=0 to whatever do
  begin
    SQL_dataset1.ParamByName('Table A Field 1').AsString:='Value';
    SQL_dataset1.ExecSQL; 

    SQL_dataset2.ParamByName('Table B Field 1').AsString:='Value';
    SQL_dataset2.ExecSQL; 
  end;

  SQL_connection.Commit(SQL_transaction);
except
  SQL_connection.Rollback(SQL_transaction);  
end;


我正在使用Delphi XE8,数据库可以是SQL Server或SQLite。

最佳答案

事务处理的逻辑是正确的(@whosrdaddy提到的缺少的异常重新引发除外)。问题是缺少数据集实例的try..finally块。除了您应该停止使用使用TSQLConnection记录的TTransactinDesc弃用的方法(在构建应用程序时始终检查编译器警告)。您还可以切换到TSQLQuery组件。尝试这样的事情:

var
  I: Integer;
  Query1: TSQLQuery;
  Query2: TSQLQuery;
  Connection: TSQLConnection;
  Transaction: TDBXTransaction;
begin
  ...  
  Query1 := TSQLQuery.Create(nil);
  try
    Query1.SQLConnection := Connection;
    Query1.SQL.Text := '...';

    Query2 := TSQLQuery.Create(nil);
    try
      Query2.SQLConnection := Connection;
      Query2.SQL.Text := '...';

      Transaction := Connection.BeginTransaction;
      try
        // fill params here and execute the commands
        for I := 0 to 42 to
        begin
          Query1.ExecSQL;
          Query2.ExecSQL;
        end;
        // commit if everything went right
        Connection.CommitFreeAndNil(Transaction);
      except
        // rollback at failure, and re-raise the exception
        Connection.RollbackFreeAndNil(Transaction);
        raise;
      end;
    finally
      Query2.Free;
    end;
  finally
    Query1.Free;
  end;
end;

关于sql-server - 事务中的多个参数化的Delphi SQL更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31347418/

相关文章:

c# - 如何在存储过程参数中传递多条记录?

sql-server - 清除 SQL 表最快的方法是什么?

delphi - 在 pascal 中动态分配匿名泛型函数

delphi - 从 Delphi 中的类引用变量访问类常量

android - 从外部 MySQL 数据库单向同步 Android SQLite 数据库

sql-server - 如何在 SSRS 中显示列中的数据

sql - SQL 2008 中的临时表和表变量有什么区别?

Delphi DBgrid 在错误更新时撤消更改

java - 这个 SQLite 查询有什么问题?

java - 在 android 应用程序中使用我自己的 SQLiteDatabase