2009-07-28 12 views
6

Sono confuso quando provo a recuperare le righe della tabella in mysql utilizzando C++ con MySQL C API.Recupero di righe in una tabella di database MySQL utilizzando MySQL C API e C++

posso farlo facilmente in PHP, solo perché C++ è un linguaggio fortemente tipizzato in modo che abbiamo anche bisogno di prendersi cura del processo di sporco ..

è così che ho fatto in PHP

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

Ma come fare lo stesso in C++ con MySQL API?

Ecco il mio codice finora .... con un vicolo cieco di confusione ... 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 
      } 
     } 
    }

Fondamentalmente ho voluto ottenere un valore da un campo nella tabella del database e memorizzarlo in una variabile. .

sarebbe apprezzato Qualsiasi tipo di aiuto :)

Grazie

risposta

13

Nella API MySQL C, mysql_fetch_row restituisce un oggetto MYSQL_ROW, che è essenzialmente un ar raggio di valori nella riga corrente.

Quindi, il codice dovrebbe essere qualcosa del tipo:

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

Meglio ancora, non fanno un "SELECT * FROM mytable" in un programma. Sarebbe molto meglio nominare i campi che ci si aspetta, in modo da poter essere sicuri dell'ordine dei campi restituiti.

+0

Grazie mille^______^ha risolto il mio problema –

+0

Che cosa significa la sigla "conf" stand nei vostri nomi delle variabili? –

+3

Questo perderà memoria. "Devi anche chiamare mysql_free_result() dopo aver finito con il set di risultati." https://dev.mysql.com/doc/refman/5.7/en/mysql-store-result.html Vedi anche https://dev.mysql.com/doc/refman/5.7/en/c-api-function -overview.html –

4

Se si utilizza C++ perché non si utilizza MySQL++? Questo è un codice di esempio:

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

Inoltre (per impostazione predefinita) il codice del connettore C++ genera eccezioni se qualcosa non riesce. Poiché il tuo codice C di esempio non ha alcun errore nella gestione di _at all_, potresti essere interessato a tale funzione. – VolkerK

+0

Sì, proverò MySQL ++ presto. Grazie per il suggerimento –

+0

Nit: hai bisogno di doppie virgolette per "columntobefetched" –