Déclaration et initialisation de VARIANT (VT_BSTR)

Résolu
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 13 mars 2013 à 11:09
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 - 16 mars 2013 à 09:02
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

LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 mars 2013 à 11:32
Auto réponse:

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

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

avec string moduleName ;

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

une idée?SVP?

 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mars 2013 à 17:21
Utilise _bstr_t en place de VARIANT.bstr.

ciao...
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 mars 2013 à 18:18
tu veux dire directement dans la création du paramètre ?
de ne pas du tout utiliser de Variants?

 
0
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 mars 2013 à 18:51
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] ) );
}


 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
13 mars 2013 à 18:58
_bstr_t EST un VARIANT, ce n'est qu'une encapsulation facilitant l'emploi.

ciao...
0
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
13 mars 2013 à 19:01
ok, merci je ne savais pas. Je vais essayer.


 
0
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
14 mars 2013 à 09:22
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;

 
0
BruNews Messages postés 21040 Date d'inscription jeudi 23 janvier 2003 Statut Modérateur Dernière intervention 21 août 2019
15 mars 2013 à 18:44
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...
0
LaTatadu91 Messages postés 967 Date d'inscription jeudi 20 mai 2004 Statut Membre Dernière intervention 26 avril 2013 1
16 mars 2013 à 09:02
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?

 
0
Rejoignez-nous