2009-07-28 6 views
6

Ich bin verwirrt, wenn ich versuche, Tabellenzeilen in MySQL mit C++ mit MySQL C API zu holen.Holen von Zeilen in einer MySQL-Datenbanktabelle mit MySQL C API und C++

ich es einfach in PHP tun, nur weil C++ eine stark typisierte Sprache ist, so dass wir auch kümmern sich um den schmutzigen Prozess benötigen ..

Dies ist, wie ich es in PHP getan

Aber wie geht das Gleiche in C++ mit MySQL API?

Hier ist mein Code so weit .... mit einer verwirrenden Sackgasse ... 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 
      } 
     } 
    }

Grundsätzlich ich einen Wert aus einem Feld in der Datenbanktabelle und speichern Sie es auf eine Variable erhalten wollte. im wesentlichen ein ar ist.

würde jede Art von Hilfe :)

Dank

Antwort

13

In dem MySQL-C-API, kehrt geschätzt wird mysql_fetch_row ein MYSQL_ROW Objekt, das Strahl von Werten in der aktuellen Zeile.

Also, sollten Sie Ihren Code so etwas wie sein:

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... 
    } 
} 

Noch besser wäre es, tu das nicht ein in einem Programm "FROM mytable * SELECT". Es wäre viel besser, die von Ihnen erwarteten Felder zu benennen, damit Sie sich der Reihenfolge der zurückgegebenen Felder sicher sein können.

+0

Vielen Dank^______^es mein Problem gelöst –

+0

Was bedeutet die Abkürzung „conf“ in Ihren Variablennamen steht? –

+3

Dadurch wird Speicher verloren. "Sie müssen auch mysql_free_result() aufrufen, nachdem Sie mit der Ergebnismenge fertig sind." https://dev.mysql.com/doc/refman/5.7/en/mysql-store-result.html Siehe auch https://dev.mysql.com/doc/refman/5.7/en/c-api-function -overview.html –

4

Wenn Sie C++ verwenden, warum nicht MySQL++ verwenden? Diese ist ein Beispielcode:

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

Auch (standardmäßig) löst der C++ Connector-Code Ausnahmen aus, wenn etwas fehlschlägt. Da Ihr Beispiel-C-Code keine Fehlerbehandlung _at all_ aufweist, könnten Sie an dieser Funktion interessiert sein. – VolkerK

+0

Ja, ich werde MySQL bald ausprobieren. Danke für den Vorschlag –

+0

Nit: du brauchst doppelte Anführungszeichen um "columntobefetched" –