2009-07-28 21 views
6

Estoy confundido cuando trato de obtener filas de tabla en mysql usando C++ con MySQL C API.Obteniendo filas en una tabla de base de datos MySQL utilizando MySQL C API y C++

puedo hacerlo fácilmente en PHP, simplemente debido a que C++ es un lenguaje fuertemente tipado de manera que también tenemos que cuidar el proceso sucia ..

así es como lo he hecho en PHP

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

Pero, ¿cómo hacer lo mismo en C++ con la API de MySQL?

Aquí está mi código hasta ahora .... con un callejón sin salida confuso ... 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 
      } 
     } 
    }

Básicamente quería obtener un valor de un campo en la tabla de base de datos y almacenarlo en una variable. .

Cualquier tipo de ayuda sería apreciada :)

Gracias

Respuesta

13

En la API MySQL C mysql_fetch_row, devuelve un objeto MYSQL_ROW, que es esencialmente un AR rayo de valores en la fila actual.

Por lo tanto, el código debe ser algo como:

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

Mejor aún, no hacen un "SELECT * FROM mytable" en un programa. Sería mucho mejor nombrar los campos que espera, para que pueda estar seguro del orden de los campos devueltos.

+0

Muchas gracias^______^resolvió mi problema –

+0

¿Qué significa la abreviatura "conf" reposar en los nombres de variables? –

+3

Esto perderá memoria. "También debe llamar a mysql_free_result() después de que haya terminado con el conjunto de resultados". https://dev.mysql.com/doc/refman/5.7/en/mysql-store-result.html Véase también https://dev.mysql.com/doc/refman/5.7/en/c-api-function -overview.html –

4

Si usa C++, ¿por qué no usa MySQL++? Este es un código de ejemplo:

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

También (de forma predeterminada) el código del conector C++ arroja excepciones si algo falla. Debido a que su código C de ejemplo no tiene ningún error al manejar _todo_, es posible que le interese esa característica. – VolkerK

+0

Sí, intentaré MySQL ++ pronto. Gracias por la sugerencia –

+0

Nit: necesita comillas dobles en torno a "columntobefetched" –

Cuestiones relacionadas