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