====== sqlite3_get_table ====== ===== C-Code ===== Codeschnipsel für C sqlite3* dbs; char command[300]; char* ptr_command = command; char* error_get_table=NULL; char** result=NULL; int column=0; int row=0; printf("SQL Kommando eingeben"); fgets(ptr_command,300,stdin); if (sqlite3_get_table(dbs,ptr_command,&result,&row,&column,&error_get_table)) { printf("SQLite Fehler: %s",error_get_table); sqlite3_free(error_get_table); error_get_table=NULL; } print_result(result,row,column); sqlite3_free_table(result); result=NULL; Ausgabefunktion: int print_result(char** result,int column,int row) { int couter=row*column+row; int i; for (i=0;i!=couter;i++) { printf("%s\n",result[i]); } return 0; } ===== C++-Code ===== Codeschnipsel für C++ sqlite3* dbs; string command; char* error_get_table=NULL; char** result=NULL; int column=0; int row=0; cout << "SQL Kommando eingeben: "; getline(cin,command); if (sqlite3_get_table(dbs,command.c_str(),&result,&row,&column,&error_get_table)) { cerr << "SQLite Fehler: " << error_get_table << endl; sqlite3_free(error_get_table); error_get_table=NULL; } print_result(result,row,column); sqlite3_free_table(result); resulte=NULL; } Ausgabefunktion: int print_result(char** result,const int &column,const int &row) { int couter=row*column+row; for (int i=0;i!=couter;i++) { cout << result[i] << endl; } return 0; } ===== Erklärung: ===== Die Funktion [[dbs:sqlite:libsqlite3:ref:sqlite3_get_table|sqlite3_get_table()]] arbeitet im Prinzip ziemlich ähnlich wie [[dbs:sqlite:libsqlite3:ref:sqlite3_exec|sqlite3_exec()]]. Der Unterschied besteht darin, wie die Funktionen ihre Werte zurückliefern. Während sqlite3_exec() eine Funktion erwartet, die die Daten auswertet, legt [[dbs:sqlite:libsqlite3:ref:sqlite3_get_table|sqlite3_get_table()]] die Werte auf dem Heap ab und liefert einen Zeiger darauf zurück. Die Anzahl der Spalten und Zeilen werden in zwei separate Integervariablen geschrieben. Hier erst einmal die betreffende Codezeile: sqlite3_get_table(dbs,ptr_command,&result,&row,&column,&error_get_table Die Funktion erwartet die folgenden Parameter: - Pointer auf eine geöffnete Datenbank vom Typ [[dbs:sqlite:libsqlite3:ref:sqlite3|sqlite3]] (siehe [[dbs:sqlite:libsqlite3:connect|Datenbankverbindung aufbauen]]) - char-Pointer auf das erste Zeichen eines Chararrays, dass das SQL-Kommando enthält. - char%%***%%-Pointer für die Rückgabewerte - int-Pointer für die Zeilenanzahl in der Tabelle - int-Pointer für die Spaltenanzahl in der Tabelle - char%%**%%-Pointer für die Fehlermeldungen Um kein Speicherleck zu erzeugen, müssen sowohl die Fehlermeldungen, als auch die Rückgabewerte explizit freigegeben werden. Für die Fehlermeldungen geschieht das über die Funktion [[dbs:sqlite:libsqlite3:ref:sqlite3_free|sqlite3_free()]]. Die Rückgabewerte werden über [[dbs:sqlite:libsqlite3:ref:sqlite3_get_table|sqlite3_free_table()]] freigegeben. Wie werden die Werte im Array abgelegt? Gehen wir von der folgenden Tabelle aus: ^Name ^ Vorname^ |Mayer | Franz | |Huber | Karl | |Mueller | Werner | Im Array würden sie wie folgt liegen:\\ \\ Result[0] = "Name";\\ Result[1] = "Vorname";\\ Result[2] = "Mayer";\\ Result[3] = "Franz";\\ Result[4] = "Huber";\\ Result[5] = "Karl";\\ Result[6] = "Mueller";\\ Result[7] = "Werner";\\ Die obige Rückgabefunktion errechnet eigentlich nur die Anzahl der Werte und gibt sie dann der Reihe nach in einer for-Schleife aus.