|
版本:2144
代码如下:
static function TProgram.CommitData(AHeaderDs, ADetailDs, AListDs: TSQLDataSet; ASQLs: string): Boolean;
var
lQuery: TQuery; lSQLs, lSQL: string; //用于执行SQL语句
lTransHandle: TTransactionHandle;
begin
//先POST
if AHeaderDs.State in DB.dsEditModes then
AHeaderDs.Post;
if (ADetailDs <> nil) and (ADetailDs.Active) and (ADetailDs.State in DB.dsEditModes) then
ADetailDs.Post;
if (AListDs <> nil) and (AListDs.Active) and (AListDs.State in DB.dsEditModes) then
AListDs.Post;
lSQLs := ASQLs; Result := False;
lQuery := TQuery.Create(nil);
try
lQuery.Connection := AHeaderDs.Connection;
with AHeaderDs.Connection.Transaction do
begin // Start 后面的参数是指事务的启动方式,分为立即方式和非立即方式,建议使用False,非立即方式
lTransHandle := Start(False); //启动事务
try // 提交数据
AHeaderDs.ApplyUpdates(False);
if (ADetailDs <> nil) and (ADetailDs.Active) then
ADetailDs.ApplyUpdates(False);
if (AListDs <> nil) and (AListDs.Active) then
AListDs.ApplyUpdates(False);
if ASQLs > ' ' then
begin
repeat
lSQL := TCommon.GetDelStr(lSQLs, ';', 'L');
lQuery.CommandText := lSQL;
lQuery.Execute;
until lSQLs = '';
end;
Commit(lTransHandle); // 结束
Result := True;
except
on E: Exception do
begin
Rollback(lTransHandle); //回滚事务
{if AListDs <> nil then
AListDs.CancelUpdates;
if ADetailDs <> nil then //利用
ADetailDs.CancelUpdates;}
jsDialogs.ShowError('保存数据提交失败:' + #13#10 + E.Message, '提示');
end;
end;
end;
finally
lQuery.Free;
end;
end;
出现问题:两个数据集一起提交,同时参数 ASql中带有一个insert 语句,很多情况下程序运行都是正常,偶尔会出现 保存数据提交失败:执行更新数据的时候出现错误:DBX Error:No Mapping for Error Code Found
前两个数据集已经提交数据了,但是insert语句没有能够成功插入,为什么出错了没有回滚?
会是什么原因呢? |
|