默认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;
但不希望每次都这么想。
答案 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;