4

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;

初めて試したとき、なぜうまくいかなかったのかわかりません。

4

4 に答える 4

2

これは、ADOでパラメータを設定する正しい方法です。表示されるメッセージは、ほとんどの場合、一部のフィールドのタイプミスが原因です(フィールドが存在しない場合は同じメッセージが表示されます)。

于 2008-11-17T13:40:41.320 に答える
0

それらを文字列として保存しないでください。uniqueidentifier を使用する必要があります。使用する 2 つの関数は、GUIDToString と StringToGUID (str-ones ではありません) です。

Active Directory から値をコピーする場合 (ftVarBytes として提供されます)、assign を使用できます。

QueryIns.Parameters.ParamByName('GUID').Assign(Query.FieldByName('objectGUID'));

AD から objectGUID を抽出する場合は、objectGUID を uniqueidentifier にキャストする必要があります。

Query.SQL.Add('select cast(objectGUID as uniqueidentifier) as objectGUID');
Query.SQL.Add('from vwADGroups');
Query.Open;
while not Query.Eof do begin
  Index := List.IndexOfName(Query.FieldByName('objectGUID').AsString);
  //...
end;
于 2009-07-28T08:41:23.777 に答える
-2

パラメータが TGuid であることが確実な場合は、次のように動作するはずです。

TGuidField(TheQuery.ParamByName('AGuid')).AsGuid

これは内部で GuidToString を実行しますが、問題はおそらく同じです。試すだけの価値があります!

于 2008-11-17T13:37:07.597 に答える