2008-11-17 7 views
4

MS Access permet le type numérique GUID (en allemand il s'appelle 'Replikations-ID', donc je devine en anglais ce qui serait 'ID de réplication') qui est stocké comme un champ binaire de 16 octets dans la base de données.Comment définir un GUID en tant que paramètres de requête ADO à partir de Delphi?

J'ai trouvé comment accéder à ces domaines Delphi avec TADOQuery/TADOTable utilisant

(TheQuery.FieldByName('SomeGuidField') as TGUIDField).AsGuid; 

Mais maintenant, je veux exécuter un comme requête SQL ceci:

SELECT * FROM SomeTable WHERE SomeGuidField=:AGuid 

J'essayé d'installer un TADOQuery.SQL propriété à l'instruction ci-dessus, mais n'a trouvé aucun moyen de définir le paramètre AGuid afin que la requête puisse être ouverte. Tout ce que j'ai essayé a donné lieu à la (ADO/COM) Erreur

Aucune valeur donnée pour un ou plusieurs paramètres requis

Par exemple:

TheQuery.ParamByName('AGuid').Value := QuotedString(GuidToStr(AGuid)); 
TheQuery.Open; // <<== crashes here 

Cela ne fonctionne pas non plus:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid); 
TheQuery.Open; // <<== crashes here 

J'ai eu un regard sur la façon dont TGuidField(...).AsGuid œuvres et trouvé qu'il convertit d'abord le GUID en une chaîne puis la chaîne en une variante (et vice versa).

Il fonctionne très bien, si je produis toujours la requête SQL comme ceci:

SELECT * FROM SomeTable WHERE SomeGuidField='<a guid goes here>' 

Comme je passe que TADOQuery objet autour du programme que je voudrais changer seulement le AGuid -parameter à garder la plupart des méthodes agnostiques sur l'instruction SQL réelle.

Existe-t-il un autre moyen de définir un paramètre GUID que de toujours modifier l'instruction SQL complète?

(Il doit y avoir un GUID parce que je besoin d'un identificateur global unique pour synchroniser avec d'autres bases de données qui sont MS SQL ou MS Access de.)

Modifier vradmilovic a raison, cela fonctionne:

TheQuery.ParamByName('AGuid').Value := GuidToStr(AGuid); 
TheQuery.Open; 

Je ne comprends pas pourquoi cela n'a pas fonctionné la première fois que je l'ai essayé.

+1

attente, fermé comme trop localisée? Je serais fortement en désaccord. Je devrais ressusciter cette question et lancer un vote ré-ouvert. –

Répondre

2

C'est la bonne façon de régler les paramètres avec ADO. Le message que vous obtenez est probablement dû à une faute de frappe avec certains champs (vous obtenez le même message si le champ n'existe pas).

-2

Si vous êtes sûr le paramètre est un TGUID, alors ce qui suit devrait fonctionner:

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

Bien que cela fait un GUIDToString interne, de sorte que le problème peut-être la même chose. Ça vaut le coup d'essayer!

+0

entraîne une violation d'accès –

+0

Dans ADO, 'ParamByName()' retourne un 'TParameter', qui ne provient pas de' TField' et ne peut pas être casté à 'TGuidField'. –

0

Pour ce qui est utile, j'utilise des GUID mais je les sauvegarde dans DB comme des chaînes.

0

Vous ne devez pas les enregistrer en tant que chaînes. Vous devriez utiliser uniqueidentifier. Les deux fonctions à utiliser sont GUIDToString et StringToGUID (pas les str-ones).

Si vous copiez des valeurs à partir du répertoire actif (vient comme ftVarBytes), vous pouvez utiliser attribuer ce qui fait la magie pour vous:

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

Si vous voulez extraire le objectGUID de AD vous devez lancer le 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;