我试图在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/