默认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 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;
但宁愿不必每次都考虑这一点。