默认的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是
FireDACFBDynamic SQL错误‘#$D#$A’SQL错误代码=-204‘#$D#’表未知‘#$D#$A’‘tt_日历’#$D#$A‘$A’在第1行,第8栏
我没有ReconcileErrorHandler,在上面的代码中,HandleUpdateError返回false,但由于某种原因,异常没有出现。
我的设计是:
在DevExpress TcxSchedulerStorage中创建的新事件,连接到TDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TFDConnection,在本例中是火鸟数据库。所有默认设置,简单的select * from tablename中的TFDQuery.SQL.Text,
使用Delphi东京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;但我不想每次都这么想。
发布于 2018-04-16 11:15:06
正如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;https://stackoverflow.com/questions/49695563
复制相似问题