0

我有 TClientDataSet、TDataSetProvider 和 TIBQuery 链,并且在执行 CDS.Post 时出现“未准备好的语句”错误,显然,TDataSetProvider 生成的更新语句是错误的。如何捕获此更新 SQL?SQL 监控不适用于我的 IBX 组件。我尝试使用代码(受TClientDataset 启发。使用 SQLDirect 组件时,ApplyUpdates 失败并出现“不支持 SQL”):

procedure TSQLResolver.DoExecSQL(SQL: TWideStringList; Params: TParams);
var
  RowsAffected: Integer;
  TmpList: TStringList;
begin
  TmpList:=TStringList.Create;
  TmpList.LoadFromFile('C:\Test\test.txt');
  RowsAffected := (Provider.DataSet as IProviderSupport).PSExecuteStatement(SQL.Text, Params);
  if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
  begin
    TmpList.Add(SQL.Text);
    TmpList.SaveToFile('C:\Test\test.txt');
    TmpList.Free;
    (Provider.DataSet as IProviderSupport).PSEndTransaction(False);
    Provider.TransactionStarted := False;
    DatabaseError(STooManyRecordsModified);
  end;
  if RowsAffected < 1 then
    DatabaseError(SRecordChanged);
end;

但是 Test/test.txt 文件中没有写入任何内容。我在哪里可以放置这样的日志记录代码?

Delphi 2010 但我想这适用于任何版本的 Delphi。

4

1 回答 1

1

没有任何内容写入您的日志文件的原因是您添加日志记录的方式,它只会在更新影响超过一行时执行。海事组织,你的代码应该是

procedure TSQLResolver.DoExecSQL(SQL: TStringList; Params: TParams);
var
  RowsAffected: Integer;
  TmpList: TStringList;
begin
  TmpList:=TStringList.Create;
  try
    TmpList.LoadFromFile('C:\Test\test.txt');
    RowsAffected := (Provider.DataSet as IProviderSupport).PSExecuteStatement(SQL.Text, Params);
    TmpList.Add(SQL.Text);
    TmpList.SaveToFile('C:\Test\test.txt');
    if not (poAllowMultiRecordUpdates in Provider.Options) and (RowsAffected > 1) then
    begin
      (Provider.DataSet as IProviderSupport).PSEndTransaction(False);
      Provider.TransactionStarted := False;
      DatabaseError(STooManyRecordsModified);
    end;
    if RowsAffected < 1 then
      DatabaseError(SRecordChanged);
  finally
    TmpList.Free;
  end;
end;

无论更新的行数如何,它都应该起作用。它还通过在仅有条件地执行的代码中释放 TmpList 来修复您设置的 TmpList 泄漏。顺便说一句,如所写,您会发现此代码不会记录由 in 中的值输入的值Params,但很容易将这些值添加到日志中,甚至将它们合并到记录的 SQL.Text 中。

希望这可以解决您当前的问题,但坦率地说,您最好将时间花在将代码简化为mre。我说这有几个原因,首先,我从来没有使用 IBX + DSP/CDS 的“未准备语句”错误,其次,使用 IBX 组件进行日志记录通常可以正常工作,第三,准备 mre 经常会揭示问题的原因。所以我怀疑你没有向我们展示的代码有错误。

如果您将 mre 设置为使用 IB 示例数据库之一并将其作为新 q 发布在此处(请不要作为对此的编辑),您更有可能找到准备自己尝试的读者。

于 2019-10-25T12:09:47.420 回答