0

默认TDataSetProvider.Options.poUseQuoteChar值为真。

当我的 SQL 语句使用小写的表名并且我TClientDataSet.ApplyUpdates(0)没有进行任何更新而不引发异常时,我(再次)被这个咬住了。

在捕获异常DataSnap.Provider的代码中:function TCustomResolver.InternalUpdateRecord(Tree: TUpdateTree): Boolean;

except
  if ExceptObject is Exception then
  begin
    E := Exception(AcquireExceptionObject);
    PrevErr.Free;
    PrevErr := Err;
    Err := (Tree.Source as IProviderSupportNG).PSGetUpdateException(E, PrevErr);
    if HandleUpdateError(Tree, Err, FMaxErrors, FErrorCount) then
    begin
      Tree.Delta.UseCurValues := True;
      Continue;
    end else
      break;
  end else
    raise;
end;

我看到那E.Message

[FireDAC][Phys][FB]动态 SQL 错误'#$D#$A'SQL 错误代码 = -204'#$D#$A'Table unknown'#$D#$A'tt_calendar'#$D#$A'At第 1 行,第 8 列

我没有ReconcileErrorHandler,并且在上面的代码中HandleUpdateError返回 false,但由于某种原因,异常没有出现。

我的设置是:

在 DevExpress 中创建的新事件TcxSchedulerStorage连接到TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TFDConnection,在这种情况下连接到 Firebird 数据库。一切默认设置,简单select * from tablenameTFDQuery.SQL.Text
使用Delphi Tokyo 10.2.3。

是否有一个我可以更改的设置会强制异常可见并一劳永逸地解决这个问题(对于任何数据库类型)?
我什至愿意修补一个 Delphi 文件。

我现在已经用运行时代码“解决”了这个问题:

procedure TDMTT.DataModuleCreate(Sender: TObject);
var i: integer;
begin
  for i := 0 to ComponentCount-1 do
    if Components[i] is TDataSetProvider then
       (Components[i] as TDataSetProvider).Options := (Components[i] as TDataSetProvider).Options - [poUseQuoteChar];
end;

但宁愿不必每次都考虑这一点。

4

1 回答 1

1

正如Sertac Akyuz建议的那样,修改 TDataSetProvider 构造函数是一种选择。缺点是您正在修补 Delphi 代码,但我对此很好。

Datasnap.Provider中,添加指示的行:

constructor TDataSetProvider.Create(AOwner: TComponent);
begin
  inherited Create(AOwner);
  FResolveToDataSet := False;
  UpdateMode := upWhereAll;
  FDSWriter := nil;
  FConstraints := True;
  FRecordsSent := 0;
  Options := Options - [poUseQuoteChar];  // Line added
end;
于 2018-04-16T11:15:06.127 回答