Problem mit sqlite

lordfritte

Erfahrenes Mitglied
Hallo ich lerne gerade das umgehen mit sqlite unter C++, jetzt habe ich ein Problem, mein Programm:
PHP:
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

static int callback(void *NotUsed, int argc, char **argv, char **azColName){
    int i;
    for(i=0; i<argc; i++){
        printf("%s = %s\n", azColName[i], argv[i] ? argv[i] : "NULL");
    }
    printf("\n");
    return 0;
}

int main(int argc, char **argv){
    sqlite3 *db;
    int rc;
    char *databaseName = "test2.s3db";
    char *zErrMsg = 0;


    rc = sqlite3_open(databaseName, &db);

    //rc = sqlite3_exec(db, "INSERT INTO 'Mitarbeiter' (id, name, vorname) VALUES ('', 'Nachname', 'Vorname')", callback, 0, &zErrMsg);
    rc = sqlite3_exec(db, "CREATE TABLE 'Mitarbeiter' ('id' INTEGER( 5 ) NOT NULL PRIMARY KEY AUTOINCREMENT ,'name' VARCHAR( 20 ) NOT NULL ,'vorname' VARCHAR( 20 ) NOT NULL)", callback, 0, &zErrMsg);
    if(rc) printf("%d: %s", rc, sqlite3_errmsg(db));

    sqlite3_close(db);
    return 0;
}

Wenn ich dies ausführe bekomme ich das:
Code:
1: AUTOINCREMENT is only allowed on an INTEGER PRIMARY KEY
Process returned 0 (0x0)   execution time : 0.078 s
Press any key to continue.

Aber es ist doch ein Integer.
 
Zuletzt bearbeitet:
ne, dann kommt "1: near "integer": syntax error"
Was hast du denn jetzt konkret angegeben? Also bei mir funktioniert folgendes tadellos:
SQL:
create table 'employee' ('id' integer primary key autoincrement, 'name' varchar(20));
Während das folgende nicht funktioniert:
SQL:
create table 'employee' ('id' integer(5) primary key autoincrement, 'name' varchar(20));
Wie es scheint muß ein AUTOINCREMENT Feld ein voller 64bit Integer sein.

Gruß
 
Also so:
Code:
CREATE TABLE 'Mitarbeiter' ('ID' INTEGER PRIMARY KEY AUTOINCREMENT, 'Name' VARCHAR( 20 ) NOT NULL, 'Vorname' VARCHAR( 20 ) NOT NULL)
geht es.
Aber jetzt habe ich ein gewaltiges Problem mit dem C++ Code, ich habe hier ein Programm:
PHP:
#include <stdio.h>
#include <stdlib.h>
#include "sqlite3.h"

typedef struct sqlite_vm sqlite_vm;

int sqlite_compile(
    sqlite3 *db,              /* The open database */
    const char *zSql,        /* SQL statement to be compiled */
    const char **pzTail,     /* OUT: uncompiled tail of zSql */
    sqlite_vm **ppVm,        /* OUT: the virtual machine to execute zSql */
    char **pzErrmsg          /* OUT: Error message. */
);

int sqlite_step(
    sqlite_vm *pVm,          /* The virtual machine to execute */
    int *pN,                 /* OUT: Number of columns in result */
    const char ***pazValue,  /* OUT: Column data */
    const char ***pazColName /* OUT: Column names and datatypes */
);

int sqlite_finalize(
    sqlite_vm *pVm,          /* The virtual machine to be finalized */
    char **pzErrMsg          /* OUT: Error message */
);

int main(int argc, char **argv){
    sqlite3 *db;           /*Datenbank-Objekt*/
    sqlite_vm *dbcursor;
    char *dberr = 0;      /*Fehlermeldungen*/
    char *sql, *sqltail;  /*SQL-Kommandos*/

    /*
    * Datenbankdatei öffnen
    */
    if(!sqlite3_open("test2.s3db", &db)){
        printf("Hoppla: %sn", dberr);
        free(dberr);
        return 1;
    }


    /*
    * Beispiel für Select-Statement
    */
    sql = "SELECT * FROM Mitarbeiter";
    /* Lege Statement-Cursor an (Konstruktor) */
    if(SQLITE_OK != sqlite_compile(db, sql, &sqltail, &dbcursor, &dberr)) { //Zeile 48
        printf("Oha: %sn", dberr);
        free(dberr);
    }else{
        int ncols;        /*Anzahl zurückgegebener Spalten*/
        char **colnames;  /*Spaltennamen*/
        char **values;    /*Spalteninhalte*/

        /* arbeite Ergebnis mit Cursor ab */
        while (SQLITE_ROW == sqlite_step(dbcursor, &ncols, &values, &colnames)) { //Zeile 57
            printf("nr='%s', name='%s'n", values[0], values[1]);
        }
    }

    /*
    * Datenbank schließen
    */
    sqlite3_close(db);

    return 0;
}

Wenn ich dies nun Compilieren möchte, bekomme ich folgende Fehler:
Code:
:: === sqlite2, Debug ===
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:: In function `int main(int, char**)':
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:48: error: invalid conversion from `char**' to `const char**'
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:48: error:   initializing argument 3 of `int sqlite_compile(sqlite3*, const char*, const char**, sqlite_vm**, char**)'
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:57: error: invalid conversion from `char***' to `const char***'
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:57: error:   initializing argument 3 of `int sqlite_step(sqlite_vm*, int*, const char***, const char***)'
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:57: error: invalid conversion from `char***' to `const char***'
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:57: error:   initializing argument 4 of `int sqlite_step(sqlite_vm*, int*, const char***, const char***)'
:: === Build finished: 6 errors, 0 warnings ===
 
sqltail will nicht:
Code:
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:: In function `int main(int, char**)':
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:49: error: cannot convert `const char***' to `const char**' for argument `3' to `int sqlite_compile(sqlite3*, const char*, const char**, sqlite_vm**, char**)'
:: === Build finished: 1 errors, 0 warnings ===
 
Ja das sehe ich auch aber warum passen die nicht? Das ist die 1000€ Frage, ich habe es jetzt so dort stehen: const char **sqltail;

Ich habe es auch so versucht: const char ***sqltail;
Dann kommt dies:
Code:
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:: In function `int main(int, char**)':
E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:49: error: cannot convert `const char****' to `const char**' for argument `3' to `int sqlite_compile(sqlite3*, const char*, const char**, sqlite_vm**, char**)'
:: === Build finished: 1 errors, 0 warnings ===

Und ich habe es so versucht: const char *sqltail;
Dann kommt dies:
Code:
obj\Debug\main.o:: In function `main':E:/Daten/Dokumente/.Dokumente/Projekte/CodeBlocks/sqlite2/main.cpp:37: undefined reference to `sqlite3_open'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:49: undefined reference to `sqlite_compile(sqlite3*, char const*, char const**, sqlite_vm**, char**)'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:58: undefined reference to `sqlite_step(sqlite_vm*, int*, char const***, char const***)'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:66: undefined reference to `sqlite3_close'
:: === Build finished: 3 errors, 0 warnings ===

ALso irgendwie funktioniert nichts.
 
Und ich habe es so versucht: const char *sqltail;
Dann kommt dies:
Code:
obj\Debug\main.o:: In function `main':E:/Daten/Dokumente/.Dokumente/Projekte/CodeBlocks/sqlite2/main.cpp:37: undefined reference to `sqlite3_open'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:49: undefined reference to `sqlite_compile(sqlite3*, char const*, char const**, sqlite_vm**, char**)'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:58: undefined reference to `sqlite_step(sqlite_vm*, int*, char const***, char const***)'
:E:\Daten\Dokumente\.Dokumente\Projekte\CodeBlocks\sqlite2\main.cpp:66: undefined reference to `sqlite3_close'
:: === Build finished: 3 errors, 0 warnings ===
Das sieht doch sehr gut aus. Zumindest wurde dein Code vom Compiler akzeptiert und kompiliert.

Jetzt mußt du nur noch die sqlite3 Bibliothek richtig einbinden.

Gruß
 
Zurück