1

Firebird データベースに接続された TSimpleDataSet があります。データセットの内部データセットCommandTypeは に設定されctTable、CommandText はテーブル名に設定されています。したがって、アクティブに設定すると、次のようなクエリが生成されると思いselect * from TableNameます。

代わりに、いくつかの奇妙な理由で、DB Express コードの内部のどこかでテーブル名を引用符で囲もうとしているため、最終的にはselect * from "TableName"になり、もちろん構文エラーが発生します。どうやら引用符は読み取り専用の TSqlConnection のMetadataプロパティから来ているようなので、コードでこれを修正することはできません。(それはあまりにも理にかなっていると思います。)

これを修正する方法を知っている人はいますか?

4

2 に答える 2

2

リクエストにより、このソリューションを追加します。ただし、それは醜いハックのように感じ、可能であれば問題を回避するためのよりエレガントな方法が欲しいため、承認済みとしてマークするつもりはありません。

procedure RTTISurgery(connection: TSqlConnection);
var
  cls: TRttiType;
begin
  cls := TRttiContext.Create.GetType(connection.Metadata.ClassType);
  cls.GetField('FQuotePrefix').SetValue(connection.Metadata, '');
  cls.GetField('FQuoteSuffix').SetValue(connection.Metadata, '');
end;

注: プログラミングの問題に対する一般的な解決策として RTTI 手術法を使用することはお勧めしません。ほとんどの場合、カプセル化に違反するため、より良い解決策がない場合にのみ使用してください。(それを使用するポイントは次のとおりです。過剰にカプセル化されたバグを修正するための最後の解決策です。)

于 2011-03-23T18:04:36.023 に答える
0

引用符は、他の識別子と競合する可能性のある名前を持つテーブルを引き続き使用できるようにすることができます。ほとんどのデータベース (FB を知りません) では、引用符で囲まれている限り、予約済みの識別子をオブジェクト名として使用できます。つまり、SELECT "TIMESTAMP" FROM X は動作する可能性がありますが、SELECT TIMESTAMP FROM X は動作しない可能性があります。IIRC 新しいキーワードが導入された場合に下位互換性を許可するのは、SQL-92 ルールです。quoted を使用する場合、オブジェクト識別子は大文字と小文字が区別される可能性がある (または、覚えていない) ため、INVOICE テーブルがある場合、select * from "invoice" は機能しませんが、select * from "INVOICE " 意思。

于 2011-03-23T09:53:44.560 に答える