[Sqlite3] "no such column"

Bender86

Lieutenant
Dabei seit
Jan. 2007
Beiträge
688
Hallo miteinander,

ich benutze grade die C Sqlite3 API und sie treibt mich in den Wahnsinn, ich hoffe ihr könnt mir bei folgendem Problem helfen:

Ich versuche eine Tabelle anzulegen und mit INSERT einen Eintrag hinzuzufügen. Wenn ich das Programm ausführe bekomme ich immer folgende Fehlermeldung: "could not prepare statemnt: no such column: foo". Ich verstehe das einfach nicht, "foo" ist doch eindeutig der Wert, der in die "name"-Spalte eingefügt werden soll. Wie kommt SQlite auf die Idee, "foo" soll die Spalte sein?

Ich sehe keinen Fehler in meinem INSERT Statement und hab keine Ahnung woran es sonst liegen könnte, ich hoffe hier kann mir jemand weiter helfen.

(kompilierbar z.B mit "gcc -Wall -g -o test test.c -lsqlite3")

Code:
#include <sqlite3.h>
#include <stdlib.h>
#include <stdio.h>
#include <string.h>

int main(int argc, char **argv) {
  
  sqlite3 *db;
  int res;
  
  // DB oeffnen
  if(sqlite3_open("test.sqlite", &db) != SQLITE_OK) {
    fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
    sqlite3_close(db);
    return -1;
  }
   
  // Tabelle erstellen
  char *errmsg = NULL;
  res = sqlite3_exec(db, "CREATE TABLE test(id INTEGER PRIMARY KEY ASC, "
          "name TEXT);", 0, 0, &errmsg);
  if(res != SQLITE_OK) {
    fprintf(stdout, "SQL error: %s\n", errmsg);
    sqlite3_free(errmsg);
  }
  
  // Eintrag einfuegen
  sqlite3_stmt *stmnt;
  char *query = "INSERT INTO test (name) VALUES (foo);";
  res = sqlite3_prepare_v2(db, query, -1, &stmnt, NULL);
  
  if(res != SQLITE_OK) {
    printf( "could not prepare statemnt: %s\n", sqlite3_errmsg(db) );
    return -1;
  }
  
  res = sqlite3_step(stmnt);
  sqlite3_finalize(stmnt);
  
  if(sqlite3_close(db) == SQLITE_BUSY) {
    fprintf(stdout, "Cannot close the db, there are unfinished statements running. %s\n", sqlite3_errmsg(db));
    return -1;
  }
  return 0;
}
Ergänzung ()

*seufz* Gut das ich seit zig Stunden rumsuche, es nicht lösen kann und kaum das ich hier geschrieben hab die Lösung finde. Es fehlten die Quotes um "foo". Richtig ist:

Code:
char *query = "INSERT INTO test (name) VALUES ('foo');";
Danke fürs zuhören. -.-
 

xSeppelx

Lt. Junior Grade
Dabei seit
Sep. 2009
Beiträge
383
Kleiner Tipp:
Deswegen führe ich die Querys erst in der DB aus und wenn dort alles läuft übernehme ich sie ins den Quellcode.
 
Top