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

LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 mars 2013 à 11:09 - Dernière réponse : LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention
- 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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 mars 2013 à 11:32
3
Merci
Auto réponse:

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

 

Merci LaTatadu91 3

Codes Sources a aidé 88 internautes ce mois-ci

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

avec string moduleName ;

 

Merci LaTatadu91 3

Codes Sources a aidé 88 internautes ce mois-ci

Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 mars 2013 à 14:21
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 mars 2013 à 17:21
0
Merci
Utilise _bstr_t en place de VARIANT.bstr.

ciao...
Commenter la réponse de BruNews
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 mars 2013 à 18:18
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 13 mars 2013 à 18:51
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 13 mars 2013 à 18:58
0
Merci
_bstr_t EST un VARIANT, ce n'est qu'une encapsulation facilitant l'emploi.

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


 
Commenter la réponse de LaTatadu91
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 14 mars 2013 à 09:22
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
BruNews 21054 Messages postés jeudi 23 janvier 2003Date d'inscription 7 novembre 2014 Dernière intervention - 15 mars 2013 à 18:44
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
LaTatadu91 968 Messages postés jeudi 20 mai 2004Date d'inscription 26 avril 2013 Dernière intervention - 16 mars 2013 à 09:02
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.