2009-07-28 3 views
6

Je suis confus lorsque je tente d'extraire des lignes de table dans mysql en utilisant C++ avec MySQL C API.Récupération de lignes dans une table de base de données MySQL à l'aide de MySQL C API et C++

Je peux le faire facilement en PHP, juste parce que C++ est un langage fortement typé afin que nous devons aussi prendre soin du processus sale ..

Voici comment je l'ai fait en PHP

$data = array(); 
$i = 0; 
$query = mysql_query("SELECT * FROM `my_table`"); 
while($fetch = mysql_fetch_array($query)) 
{ 
    $data[$i] = $fetch['columntobefetched']; 
    $i++; 
}

Mais comment faire la même chose en C++ avec l'API MySQL?

Voici mon code à ce jour .... avec une impasse confusion ... x__x

 MYSQL *sqlhnd = mysql_init(NULL); 
    mysql_real_connect(sqlhnd, "server", "user", "pass", "database", port, NULL, 0); 

    mysql_query(sqlhnd, "SELECT * FROM `my_table`"); 
    MYSQL_RES *confres = mysql_store_result(sqlhnd); 
    int totalrows = mysql_num_rows(confres); 
    int numfields = mysql_num_fields(confres); 
    MYSQL_FIELD *mfield; 

    while((row = mysql_fetch_row(confres))) 
    { 
     for(i = 0; i < numfields; i++) 
     { 
      while(mfield = mysql_fetch_field(confres)) 
      { 
       mfield->//??? I'm dead 
      } 
     } 
    }

Fondamentalement, je voulais obtenir une valeur d'un champ dans la table de base de données et le stocker à une variable. .

Toute aide serait appréciée :)

Merci

Répondre

13

Dans l'API MySQL C, mysql_fetch_row retourne un objet MYSQL_ROW, qui est essentiellement un ar rayon de valeurs dans la ligne actuelle.

Ainsi, votre code devrait être quelque chose comme:

mysql_query(sqlhnd, "SELECT * FROM `my_table`"); 
MYSQL_RES *confres = mysql_store_result(sqlhnd); 
int totalrows = mysql_num_rows(confres); 
int numfields = mysql_num_fields(confres); 
MYSQL_FIELD *mfield; 

while((row = mysql_fetch_row(confres))) 
{ 
    for(i = 0; i < numfields; i++) 
    { 
     char *val = row[i]; 
     // do something with val... 
    } 
} 

Mieux encore, ne fais pas "SELECT * FROM mytable" dans un programme. Il serait beaucoup mieux de nommer les champs que vous attendez, de sorte que vous pouvez être sûr de l'ordre des champs retournés.

+0

Merci beaucoup^______^il a résolu mon problème –

+0

Que signifie l'abréviation « ConF » pour tenir dans vos noms de variables? –

+3

Cela entraînera une fuite de mémoire. "Vous devez également appeler mysql_free_result() après avoir terminé le jeu de résultats." https://dev.mysql.com/doc/refman/5.7/en/mysql-store-result.html Voir aussi https://dev.mysql.com/doc/refman/5.7/fr/c-api-function -overview.html –

4

Si vous utilisez C++, pourquoi ne pas utiliser MySQL++? Ce est un exemple de code:

mysqlpp::Connection dbconnection; 
dbconnection.connect("database", "server", "user", "pass"); 

mysqlpp::Query prepared_query = dbconnection.query("SELECT * FROM `my_table`"); 

mysqlpp::StoreQueryResult r = prepared_query.store(); 

int field = r.field_num("columntobefetched"); 

for(mysqlpp::StoreQueryResult::iterator i = r.begin(); i!=r.end();i++) 
{ 
     std::cout << i->at(field) << std::endl; 
     std::cout << (*i)["columntobefetched"] << std::endl; // this will be slower 
} 
+2

Aussi (par défaut) le code du connecteur C++ jette des exceptions si quelque chose échoue. Comme votre exemple de code C ne contient aucune erreur de gestion de _tous_, vous pourriez être intéressé par cette fonctionnalité. – VolkerK

+0

Oui, je vais bientôt essayer MySQL ++. Merci pour la suggestion –

+0

Nit: vous avez besoin de guillemets autour de "columntobefetched" –