Guida MySQL: Accesso a MySQL da C
http://www.swprog.com/guide/mysql-c-rw.php
9 Gennaio 2008 Database





Le Query


Per effettuare le query vi sono due funzioni a disposizione, mysql_query() e mysql_real_query(). La prima si aspetta che il testo della query sia una stringa che termini con un carattere NULL, e non può essere usata per quelle query che contengono dati binari. Se la query contiene dati binari (che potrebbero contenere byte NULL, "\0", che potrebbero essere erroneamente interpretati come la fine della stringa di query) si deve usare la mysql_real_query().
Ci sono due modi per un client di elaborare il result set. Un modo è quello di ottenere l’intero result set in una sola volta chiamando mysql_store_result() (mysql_store_result() leggerà l'intero risultato della query, allocherà una struttura MYSQL_RES ed inserirà i risultati in questa struttura. Restituirà NULL se la query non ha prodotto un result set o se fallisce la lettura del result set), il secondo modo è quello di ottenere una riga per volta usando la funzione mysql_use_result(). 
In entrambi i casi si può accedere alle righe usando la funzione mysql_fetch_row(). Se si è usata la funzione mysql_store_result() per ottenere il result set la mysql_fetch_row() preleverà la riga da un set già prelevato, mentre se è usata la funzione mysql_use_result() la mysql_fetch_row() preleverà la riga direttamente dal server.
Un vantaggio nell’utilizzo della mysql_store_result() consiste nel fatto che una volta prelevate tutte le righe si potrà accedere al result set sia in maniera sequenziale, cioè una riga dopo l’altra, sia accedendo direttamente alla riga voluta, per farlo si possono usare le due funzioni mysql_data_seek() e mysql_row_seek().
Uno svantaggio sta nel notevole uso di memoria che il caricare l’intero result set in una volta produrrebbe, mentre l’uso della mysql_use_result() richiederebbe poca memoria per caricare una sola riga alla volta.
Si può accedere alle informazioni contenute nei campi: in modo sequenziale usando ripetutamente la funzione mysql_fetch_field() scorrendo i campi all'interno della riga in modo sequenziale, oppure accedendo direttamente al campo voluto indicando il numero del campo e usando la funzione mysql_fetch_field_direct().
La posizione del cursore del campo può essere cambiata usando la funzione mysql_field_seek(). È possibile prendere informazioni su tutti i campi usando la funzione mysql_fetch_fields().
Dopo aver usato il result set si dovrà liberare la memoria allocata, per farlo si utilizzerà la funzione mysql_free_result().
Per quanto riguarda gli eventuali errori usando la funzione mysql_errno() si può determinare il codice dell’errore che è stato generato, usando la funzione mysql_error() si potrà determinare il messaggio di errore.
Per ciascuna altra query che non sia una SELECT (ad esempio INSERT, UPDATE, DELETE) si possono individuare le righe cercate della tabella chiamando la funzione mysql_affected_rows(). Per le query tipo SELECT le righe selezionate saranno poste sotto forma di result set.
Le informazioni relative alle dimensioni dei dati in ciascuna riga saranno disponibili chiamando la funzione mysql_fetch_lengths().

Accesso in Lettura

Si supponga di voler leggere dalla tabella seguente

  1. id int
  2. cognome char(25)
  3. nome char (25)
  4. eta int

Il client che accede a questa tabella e ne stampa le righe è la seguente

client-r.cpp
  1. #include <stdio.h>
  2. #include <mysql.h>
  3.  
  4. MYSQL *conn;
  5. MYSQL_RES *result;
  6. MYSQL_ROW row;
  7. char query[250];
  8.  
  9. const char* host = "localhost"; // host
  10. const char* database = "mydb"; // database
  11. const char* db_user = "root"; // nome utente
  12. const char* db_pass = "passwd"; // password
  13.  
  14. int main (int argc, char *argv[])
  15. {
  16. conn = mysql_init (NULL);
  17. mysql_real_connect (conn, /* connection handler */
  18. host, /* host */
  19. db_user, /* user name */
  20. db_pass, /* password */
  21. database, /* database */
  22. 0, /* porta */
  23. NULL, /* socket */
  24. 0); /* flags */
  25.  
  26. strcpy(query, "SELECT titolo from test.persona;");
  27. mysql_query(conn, query);
  28. result = mysql_use_result(conn);
  29.  
  30. while ((row = mysql_fetch_row(result)))
  31. {
  32. printf("Id: %s Cognome: %s Nome: %s Eta: %s \n", row[0], row[1],
  33. row[2], row[3]);
  34. }
  35.  
  36. mysql_close (conn);
  37. exit (0);
  38. }


Accesso in Scrittura

Si supponga di voler scrivere nella tabella seguente

  1. id int
  2. cognome char(25)
  3. nome char (25)
  4. eta int

Il client che accede a questa tabella legge da input i dati e li scrive nella tabella è la seguente

client-w.cpp
  1. #include <stdio.h>
  2. #include <mysql.h>
  3.  
  4. MYSQL *conn;
  5. MYSQL_RES *result;
  6. MYSQL_ROW row;
  7. char query[250];
  8. char nome[30];
  9. char cognome[30];
  10. char ch;
  11. char Eta[3];
  12. int eta;
  13.  
  14. const char* host = "localhost"; // host
  15. const char* database = "mydb"; // database
  16. const char* db_user = "root"; // nome utente
  17. const char* db_pass = "passwd"; // password
  18.  
  19. int main (int argc, char *argv[])
  20. {
  21. conn = mysql_init (NULL);
  22. mysql_real_connect (conn, /* connection handler */
  23. host, /* host */
  24. db_user, /* user name */
  25. db_pass, /* password */
  26. database, /* database */
  27. 0, /* porta */
  28. NULL, /* socket */
  29. 0); /* flags */
  30.  
  31. do
  32. {
  33. printf("Inserire nome, cognome ed età\n");
  34. scanf("%s %s %d",&nome, &cognome, &eta);
  35. itoa(eta, Eta, 10);
  36.  
  37. strcpy(query, "INSERT into test.persona VALUES ('");
  38. strcat(query, nome);
  39. strcat(query, "', '");
  40. strcat(query, cognome);
  41. strcat(query, "', '");
  42. strcat(query, Eta);
  43. strcat(query, "');");
  44. mysql_query(conn, query);
  45.  
  46. printf("Continuare? (s\n)");
  47. ch = getchar();
  48. } while (ch == 's');
  49.  
  50. mysql_close (conn);
  51. exit (0);
  52. }


 
Guida MySQL