Comment définir un GUID en tant que paramètres de requête ADO à partir de Delphi?

StackOverflow https://stackoverflow.com/questions/295511

  •  08-07-2019
  •  | 
  •  

Question

MS Access autorise le GUID de type numérique (en allemand, il s'appelle 'Replikations-ID', je suppose donc en anglais qu'il s'agisse de 'ID de réplication') qui est stocké sous la forme d'un champ binaire de 16 octets dans la base de données.

J'ai découvert comment accéder à ces champs dans Delphi avec < strong> TADOQuery / TADOTable avec

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

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

SELECT * FROM SomeTable WHERE SomeGuidField=:AGuid

J'ai essayé de définir un TADOQuery. SQL à l’instruction ci-dessus, mais n’a trouvé aucun moyen de définir le paramètre AGuid de sorte que la requête puisse être ouverte. Tout ce que j'ai essayé a entraîné l'erreur (ADO / COM)

  

Pas de valeur donnée pour un ou plusieurs paramètres obligatoires

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 examiné le fonctionnement de TGuidField (...). AsGuid et constaté qu'il convertissait d'abord le GUID en chaîne, puis la chaîne en variante (et inversement).

Cela fonctionne bien, si je génère toujours l'instruction SQL comme ceci:

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

Au moment de passer cet objet TADOQuery dans le programme, je souhaite uniquement modifier le paramètre AGuid pour que la plupart des méthodes restent agnostiques dans la même instruction SQL.

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

(Il doit s'agir d'un GUID car j'ai besoin d'un identifiant global unique pour la synchronisation avec d'autres bases de données MS SQL ou MS Access.)

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é.

Était-ce utile?

La solution

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

Autres conseils

Pour ce qui vaut la peine, j'utilise des GUID mais je les enregistre dans la base de données sous forme de chaînes.

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-one).

Si vous copiez des valeurs à partir du répertoire actif (sous la forme ftVarBytes), vous pouvez utiliser assign qui fait la magie à votre place:

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

Si vous souhaitez extraire l'objetGUID de AD, vous devez convertir l'objetGUID en identifiant unique:

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;

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

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

Bien que cela fasse un GuidToString en interne, le problème est peut-être le même. Ça vaut le coup d'essayer!

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top