2010-12-15 8 views
0

J'utilise SOCI pour créer des connexions MYSQL à partir de mon application QT4 C++. Je pourrais coder en dur un IP, un nom d'utilisateur et un mot de passe de serveur de mysql mais je préférerais passer cette information en tant que variable à la place.Comment utiliser une variable dans une ligne d'argument?

Par exemple, je voudrais faire quelque chose comme ça, mais il n'y a pas de fonctions qui acceptent ces types de paramètres:

char host [9]; 
sprintf(host, "192.x.x.x"); 
session sql(mysql, "host=%s db=dbname user=user password=password", host); 

J'ai aussi essayé:

string host = "192.x.x.x"; 

session sql(mysql, 
      boost::format("host=%1% db=dbname user=user password='pword'", 
          %host)); 

Mais cette tentative échoue également .

MISE À JOUR: J'ai pu résoudre le problème comme ceci:

QString connection; 
connection.append("host=" + host + 
        " db=dbname user=" + uname + 
        " password=" + pword); 

session sql(mysql, connection.toLatin1().data()); 

Répondre

1

Essayez d'utiliser la fonction arg de QString. Je sais que c'est moche, et Qt devrait trouver une solution plus jolie, mais cela fonctionne.

+0

erreur: aucune fonction correspondante pour l'appel à 'soci :: session :: session (const soci :: mysql_backend_factory &, QString)' ??? pense qu'il a besoin d'un const const ??? – JonnyCplusplus

+0

@user: après un bref coup d'oeil sur la documentation, je pense que vous devez utiliser .data()? – Peter

1

Utilisez string streams.

Ensuite, vous pouvez construire la chaîne et concaténer les variables que vous allez. Appelez .str().c_str() à la fin.

+0

Vous devez également utiliser '.c_str()' à la fin pour obtenir votre 'const char *'. –

+1

.str(). C_str(), d'abord à la chaîne, puis à const char * – dutt

1

Vous ne pouvez pas passer arbitrairement une fonction qui attend une chaîne contenant un formatage, puis une quantité variable de ce qui suit. C++ ne fonctionne tout simplement pas de cette façon. Vous devez construire votre chaîne avant de la transmettre. Comment? Les deux autres réponses fournissent des moyens même si elles obtiennent la sémantique d'appel du constructeur session incorrecte (c'est votre partie à comprendre). Vous pouvez aussi utiliser boost :: format ou, si vous voulez être mauvais, sprintf.

+0

Ok, je pense que j'ai fait ce que tu as dit, mais j'ai mis à jour mon post original avec mon problème ... – JonnyCplusplus

Questions connexes