Inhaltsverzeichnis

sqlite3_exec

C-Code

Codeschnipsel für C

sqlite3* dbs;
char command[300];
char *ptr_command = command;
char *error_exec=NULL;
 
 
printf("SQL Kommando eingeben:");
fgets(ptr_command,300,stdin);
if (sqlite3_exec(dbs,ptr_command,callback,NULL,&error_exec) != SQLITE_OK)
printf("SQLite Fehler: %s\n",error_exec);
{
    sqlite3_free(error_exec);
    error_exec=NULL;
}

Callback-Funktion in C:

int callback(void *unused_ptr, int number_of_lines, char **column_value, char **column_name)
{
   int i;
   for (i = 0; i != number_of_lines; ++i)
   {
       printf("%s: ",&*column_name[i]);
       if (column_value[i])
           printf("%s\n",&*column_value[i]);
   }
   return 0;
}

C++-Code

Codeschnipsel für C++

sqlite3* dbs;
string command;
char* error_exec=NULL;
 
cout << "SQL Kommando eingeben:";
getline(cin,command);
if (sqlite3_exec(dbs,command.c_str(),callback,NULL,&error_exec) != SQLITE_OK)
{
   cerr << "SQLite Fehler: " << error_exec << endl;
   sqlite3_free(error_exec);
   error_exec=NULL;
}

Callback-Funktion in C++

int callback(void *unused_ptr, int number_of_lines, char **column_value, char **column_name)
{
   for (int i = 0; i != number_of_lines; ++i) {
    cout << column_name[i] << ": ";
    if (column_value[i])
        cout << column_value[i] << endl;
}
  cout << endl;
 
  return 0;
}

Erklärung

Um ein SQL-Kommando mit sqlite3_exec() ausführen zu können, ist eine geöffnete Datenbankverbindung Voraussetzung. Im obigen Beispiel interessiert uns vor allem diese Zeile:

sqlite3_exec(dbs,ptr_command,callback,NULL,&error_exec;

Die Funktion erwartet mehrere Parameter:

  1. Einen Pointer auf eine geöffnete Datenbank.
  2. Einen Pointer auf das erste Zeichen eines Chararrays, dass das SQL-Kommando enthält.
  3. Den Namen der Callbackfunktion. (optional: NULL)
  4. Der Name eines void-Pointers. Er kann genutzt werden, um der Callback-Funktion einen Wert zu übergeben. (Optional: NULL)
  5. Einen char-Pointer über den man auf eventuelle Fehlermeldungen zugreifen kann. (Optional: NULL)

Der Char-Pointer für die Fehlermeldung wird von der Funktion dazu benutzt, dynamisch ein Chararray auf dem Heap zu erzeugen, das die Fehlermeldung enthält. Damit kein Speicherleck entsteht, muss dieser Speicher wieder freigegeben werden. Dies geschieht über sqlite3_free(). Der Funktion wird einfach der Pointer auf die Fehlermeldung übergeben und der Pointer auf NULL gerichtet.

Die Callbackfunktion wird benutzt, um die Werte, die durch den Befehl zurückgeliefert werden, auszuwerten. Die obige Callbackfunktion gibt die Werte lediglich über das Terminal aus. Die Parameter, die die Funktion übernehmen muss, sind vorgegeben:

  1. Void Pointer. Hier landet der Wert, den man als vierten Parameter an sqlite3_exec() übergeben hat.
  2. Integer Variable. Hier wird die Anzahl der Tabellenzeilen abgelegt.
  3. Char** Pointer. Hier werden die Spaltenwerte abgelegt.
  4. Char** Pointer. Hier werden die Spaltennamen abgelegt.

Wie man die Werte dann allerdings verarbeitet, bleibt der eigenen Phantasie überlassen.

Wer sich jetzt noch Fragen sollte, was ein char** Pointer ist: Es ist ein „Pointer auf Pointer auf Wert“ Konstrukt. Da es sich in bei der libsqlite3 um eine C-Bibliothek handelt, muss mit C-Strings gearbeitet werden und die werden als Chararrays abgelegt. Der rechte Pointer zeigt auf ein Chararray, das einen String mit einem Tabellenwert enthält. Der linke Pointer zeigt auf diesen Pointer. Erhöht man nun den linken Pointer, kann man durch die Texte springen. Es entspricht also im Grunde einem Array von Strings, das man über den linken Pointer durchlaufen kann.