Déclaration et initialisation de VARIANT (VT_BSTR) [Résolu]

Signaler
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
-
Bonjour,

Je code actuellement un programme en C++ (VS12) tournant sous windows (7)
qui doit en utilisant ADO exécuter une procédure stockée en passant des paramètres.

Je rencontre un soucis lors de l'execution de ce code : mes Variants s'écrasent mutuellement:
// test en dur 
VARIANT vName;
vName.vt = VT_BSTR; //Variant type for BSTR
vName.bstrVal = _bstr_t("PRS"); 

VARIANT vSev;
vSev.vt = VT_BSTR; //Variant type for BSTR
vSev.bstrVal = _bstr_t("Medium"); 

VARIANT vMess;
vMess.vt = VT_BSTR; //Variant type for BSTR
vMess.bstrVal = _bstr_t("Coucou ça va bien?"); 
pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("strType"),adVarChar,adParamInput,50,vName));
pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("strSeverity"),adVarChar,adParamInput,50,vSev));
pCommand->Parameters->Append(pCommand->CreateParameter(_bstr_t("strMessage"),adVarChar,adParamInput,50,vMess));


Donc dans vName je retrouve la string destinée à vSev etc...
du coup lors de l'execution de la requete SQL je me retrouve avec un peu n'importe quoi dans ma table (SQL server 2005)

quelqu'un saurait me guider sur l'utilisation appropriée des variants (VT_BSTR)?
car si je les utilise pour des entiers ou autre, aucun problème, et si j'utilise seulement un de type VT_BSTR ça marche bien aussi...
merci d'avance.

 

11 réponses

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Auto réponse:

V_VT(&vName)=VT_BSTR;
V_BSTR(&vName) = SysAllocString(L"Type");

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Solution trouvée:
V_BSTR(&variantArray[0]) = CComBSTR(moduleName.c_str()).Detach();

avec string moduleName ;

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Par contre je ne sais pas comment initialiser avec une string
genre
string str ="test";
V_BSTR(&vName) = str;

une idée?SVP?

 
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
Utilise _bstr_t en place de VARIANT.bstr.

ciao...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
tu veux dire directement dans la création du paramètre ?
de ne pas du tout utiliser de Variants?

 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
j'utilise les variants car j'ai créé une fonction qui prend en arguments des vector
et je créé dynamiquement mes paramètres:
for( int i = 0; i < variantArray.size(); i++ )
{
adType = GetVariantType( variantArray[i] );
pCommand->Parameters->Append( pCommand->CreateParameter( parameters[i].c_str(), adType, adParamInput, sizeArray[i], variantArray[i] ) );
}


 
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
_bstr_t EST un VARIANT, ce n'est qu'une encapsulation facilitant l'emploi.

ciao...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
ok, merci je ne savais pas. Je vais essayer.


 
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Ok, j'ai lu une doc sur _bstr_t, mon soucis est que j'ai besoin de stocker différents types (int, float, string, bool) voilà pourquoi j'ai choisi les VARIANTS.
Mon petit test en dur marche bien: par contre ça ne compile pas si j'essaye avec des variables string.
genre
string str ="test";
V_BSTR(&vName) = str;

 
Messages postés
21041
Date d'inscription
jeudi 23 janvier 2003
Statut
Modérateur
Dernière intervention
21 août 2019
26
En .NET, tout serait pris en charge et tu aurais les memes 'non' perfs sans te prendre le crane avec toute cette syntaxe a la noix.

ciao...
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Statut
Membre
Dernière intervention
26 avril 2013
1
Quand tu parles de non perfs, c'est à quel niveau? temps d'execution? Mémoire?
Et pour mes requetes SQL , j'utilise l'objet command d'ADO pour executer mes procédures stockées, c'est le mieux non niveau perf?