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

Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
- - Dernière réponse : LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
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.

 
Afficher la suite 

Votre réponse

11 réponses

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

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

 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
3
Merci
Solution trouvée:
V_BSTR(&variantArray[0]) = CComBSTR(moduleName.c_str()).Detach();

avec string moduleName ;

 

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 98 internautes ce mois-ci

Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
Par contre je ne sais pas comment initialiser avec une string
genre
string str ="test";
V_BSTR(&vName) = str;

une idée?SVP?

 
Commenter la réponse de LaTatadu91
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
Utilise _bstr_t en place de VARIANT.bstr.

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

 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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] ) );
}


 
Commenter la réponse de LaTatadu91
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
_bstr_t EST un VARIANT, ce n'est qu'une encapsulation facilitant l'emploi.

ciao...
Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
ok, merci je ne savais pas. Je vais essayer.


 
Commenter la réponse de LaTatadu91
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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;

 
Commenter la réponse de LaTatadu91
Messages postés
21054
Date d'inscription
jeudi 23 janvier 2003
Dernière intervention
7 novembre 2014
0
Merci
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...
Commenter la réponse de BruNews
Messages postés
968
Date d'inscription
jeudi 20 mai 2004
Dernière intervention
26 avril 2013
0
Merci
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?

 
Commenter la réponse de LaTatadu91

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.