MS Access では、データベースに 16 バイトのバイナリ フィールドとして格納される数値型の GUID (ドイツ語では 'Replikations-ID' と呼ばれるので、英語では 'replication id' になると思います) を使用できます。
Delphi でTADOQuery / TADOTableを使用してこれらのフィールドにアクセスする方法を見つけました。
(TheQuery.FieldByName('SomeGuidField') as TGUIDField).AsGuid;
しかし今、次のような SQL クエリを実行したいと思います。
SELECT * FROM SomeTable WHERE SomeGuidField=:AGuid
上記のステートメントにTADOQuery.SQLプロパティを設定しようとしましAGuid
たが、クエリを開くことができるように実際にパラメーターを設定する方法が見つかりませんでした。何を試しても (ADO/COM) エラーが発生しました
1 つ以上の必須パラメーターに値が指定されていません
例えば:
TheQuery.ParamByName('AGuid').Value := QuotedString(GuidToStr(AGuid));
TheQuery.Open; // <<== crashes here
これも機能しません:
TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid);
TheQuery.Open; // <<== crashes here
どのようにTGuidField(...).AsGuid
機能するかを調べたところ、最初に GUID が文字列に変換され、次に文字列がバリアントに変換されることがわかりました (逆も同様です)。
常に次のように SQL ステートメントを生成すると、正常に動作します。
SELECT * FROM SomeTable WHERE SomeGuidField='<a guid goes here>'
プログラム内でそのTADOQueryオブジェクトを渡しているのでAGuid
、ほとんどのメソッドが実際の SQL ステートメントに依存しないように -Parameter のみを変更したいと考えています。
常に完全な SQL ステートメントを変更する以外に、GUID パラメータを設定する方法はありますか?
(MS SQL または MS Access ベースの他のデータベースと同期するには、グローバルに一意の識別子が必要なので、GUID である必要があります。)
編集 vradmilovicは正しいです、これはうまくいきます:
TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid);
TheQuery.Open;
初めて試したとき、なぜうまくいかなかったのかわかりません。