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 sqlite3_get_table() arbeitet im Prinzip ziemlich ähnlich wie 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 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:

  1. Pointer auf eine geöffnete Datenbank vom Typ sqlite3 (siehe Datenbankverbindung aufbauen)
  2. char-Pointer auf das erste Zeichen eines Chararrays, dass das SQL-Kommando enthält.
  3. char***-Pointer für die Rückgabewerte
  4. int-Pointer für die Zeilenanzahl in der Tabelle
  5. int-Pointer für die Spaltenanzahl in der Tabelle
  6. 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 sqlite3_free(). Die Rückgabewerte werden über 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.