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'テーブル不明'#$D#$A'tt_calendar'#$D#$A'At 1 行目、8 列目

はありません。ReconcileErrorHandler上記のコードでHandleUpdateErrorは false が返されますが、何らかの理由で例外が発生しません。

私のセットアップは次のとおりです。

TcxSchedulerStorageに接続された DevExpress で作成された新しいイベントTDataSource -> TClientDataSet -> TDataSetProvider -> TFDQuery -> TFDConnection(この場合は Firebird データベース)。 Delphi Tokyo 10.2.3 を使用しselect * from tablenameTFDQuery.SQL.Textすべてのデフォルト設定。

例外を強制的に表示し、これを完全に解決する変更できる単一の設定はありますか (任意のデータベース タイプに対して)。
私は 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