由TDataSetProvider poUseQuoteChar和小写表名称引起的异常不会浮出水面

时间:2018-04-06 14:55:10

标签: delphi firedac delphi-10.2-tokyo tdatasetprovider

默认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'在第1行,第8栏

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

我的设置是:

在DevExpress TcxSchedulerStorage中创建的新事件,连接到TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TFDConnection,在本例中为Firebird数据库。所有默认设置,select * from tablename中的简单TFDQuery.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;

但不希望每次都这么想。

1 个答案:

答案 0 :(得分: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;