db gesucht



  • @floorball92: Die SQLite API ist sehr simpel, hab schon damit mehrmals gearbeitet. Am besten fragst du, was du nicht verstehst. Das Bsp. auf der SQLite Website ist simpel und das genügt in der Regel, um zu wissen, wie man die API verwendet.



  • Zum einen habe ich garnicht verstanden, wie ich die db erstelle. Habe as sqlite3 test.db in der console aufgerufen und es wurde nix erstellt.

    Dann in dem Sampel, da wird doch der Dateiname der DB garnicht genannt.

    Ich dachte es sei so:

    es gibt die:
    xxx.db

    in der werden die Sachen gespeichert, also die Tabellen und die Datn darinne und dann habe ich ne .h die ich includiere.

    dann habe ich da die Funktionen drinne, mit der ich die SQL Anfragen an diese xxx.db sende und dann die Daten erhalte.

    So wie ich mir das aber gedacht habe ist irgendwie nicht.



  • Hier ein ganz einfaches Bsp:

    Tabelle: customer:
    +-----------------------------------+
    | ID |  Lname  |  Fname   |  Age    |
    +----+---------+----------+---------|
    | 1  | Musterm | Max      |  25     |
    +----+---------+----------+---------|
    | 2  | Meier   | Michael  |  30     |
    +-----------------------------------+
    

    Mit dem sqlite Befehl kannst du die Tabelle speichern:

    $ sqlite3 kunden.db
    sqlite> CREATE TABLE customer (
        ID INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
        Lname TEXT NOT NULL,
        Fname TEXT NOT NULL,
        Age INTEGER NOT NULL DEFAULT 0);
    
    sqlite> INSERT INTO customer (Lname, Fname, Age) VALUES('Mustermann', 'Max', 25);
    sqlite> INSERT INTO customer (Lname, Fname, Age) VALUES('Meier', 'Michael', 30);
    sqlite> .quit
    

    der Code sollte eigentlich klar sein, hab den Namen der Callback Funktionen und ihre Paramter so gewählt, dass sie selbsterklärend sind.

    #include <stdio.h>
    #include <sqlite3.h>
    #include <string.h>
    
    #define MAX_STR 1024
    
    struct customer {
        char last_name[MAX_STR];
        char first_name[MAX_STR];
        int  age;
    };
    
    int show_menu(void)
    {
        int c;
        while(1) {
            printf("1. Show customers\n");
            printf("2. Add customer\n");
            printf("3. Exit\n\n");
            printf("Choise: ");
            c = getc(stdin);
            while(getc(stdin) != '\n');
            printf("\n\n");
            switch(c)
            {
                case '1':
                case '2':
                case '3':
                    return c;
            }
        }
        return 0;
    }
    
    /* Diese Funktion ist eine Callback Funktion. Die wird von sqlite aufgerufen,
    wenn man z.b. eine QUERY hat, die Daten ausgibt (z.b. SELECT). Sie wird
    reihenweise ausgeführt. D.h. angenommen, die QUEREY ist SELECT * FROM db
    und db hat 15 Zeilen, dann wird diese Funktion 15 Mal hintereinanader für jede Zeile der Tabelle ausgeführt */
    int select_callback(void *userdata, int col_num, char **col_value, char **col_name)
    {
        int *num_records = userdata;
    
        printf("Customer %s: %s, %s (%s)\n",
                col_value[0], /* ID column */
                col_value[1], /* LName column */
                col_value[2], /* FName column */
                col_value[3]  /* age column */
              );
    
        (*num_records)++;
    
        return 0; /* do not abort execution of the SQL query */
    }
    
    void print_db(sqlite3 *db)
    {
        int num_records = 0, ret;
        char *sql_msg_err = NULL;
    
        ret = sqlite3_exec(db,
                "SELECT * FROM customer",
                select_callback,
                &num_records,
                &sql_msg_err);
    
        if(ret != SQLITE_OK)
        {
            fprintf(stderr, "SQL error: %s\n\n\n", sql_msg_err);
            sqlite3_free(sql_msg_err);
            return;
        }
    
        printf("Number of records: %d\n\n\n", num_records);
    }
    
    void insert_customer(sqlite3 *db)
    {
        char *sql_msg_err = NULL, line[MAX_STR];
        struct customer cust;
        int ret;
    
        printf("Last name: ");
        fgets(cust.last_name, sizeof(cust.last_name), stdin);
        cust.last_name[strlen(cust.last_name) - 1] = 0;
    
        printf("First name: ");
        fgets(cust.first_name, sizeof(cust.first_name), stdin);
        cust.first_name[strlen(cust.first_name) - 1] = 0;
    
        printf("Age: ");
        fgets(line, sizeof(line), stdin);
        cust.age = atoi(line);
    
        sprintf(line,
            "INSERT INTO customer (Lname, Fname, Age) VALUES('%s', '%s', %d)",
            cust.last_name, cust.first_name, cust.age);
    
        /* keine Callback Funktion notwenig, da INSERT kein Rückgabe hat */
        ret = sqlite3_exec(db, line, NULL, NULL, &sql_msg_err);
    
        if(ret != SQLITE_OK)
        {
            fprintf(stderr, "SQL error: %s\n\n\n", sql_msg_err);
            sqlite3_free(sql_msg_err);
            return;
        }
    
        printf("1 record added\n\n\n");
    }
    
    int main(int argc, char **argv)
    {
        sqlite3 *db;
        int ret;
    
        if(argc != 2)
        {
            fprintf(stderr, "usage: %s <file name>\n", argv[0]);
            return 1;
        }
    
        ret = sqlite3_open(argv[1], &db);
    
        if(ret)
        {
            fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
            sqlite3_close(db);
            return 1;
        }
    
        while(1)
        {
            ret = show_menu();
            if(ret == '3') break;
    
            if(ret == '1') print_db(db);
    
            if(ret == '2') insert_customer(db);
        }
    
        sqlite3_close(db);
    
        return 0;
    }
    

    Wenn man SQLite benutzen will, sollte mind. diese beiden Seiten geöffnet haben:



  • Datenbank erstellen klappt schonmal, nur fehlt mir noc die sqlite3.h. Habe auch mal geschaut auf der Seite und bei google, aber habe keinen download dafür gefunden.



  • Zieh dir das Paket von sqlite.org, da ist die sqlite3.h. dabei



  • Beim erstellen der .exe kommt:

    POLINK: error: Unresolved external symbol '_sqlite3_exec'.
    POLINK: error: Unresolved external symbol '_sqlite3_free'.
    POLINK: error: Unresolved external symbol '_sqlite3_open'.
    POLINK: error: Unresolved external symbol '_sqlite3_errmsg'.
    POLINK: error: Unresolved external symbol '_sqlite3_close'.
    POLINK: fatal error: 5 unresolved external(s).



  • ^^ du solltest schon die sqlite source-files mit ein das projekt einbinden.



  • Habe ich, habe #include <sqlite3.h> in den Source Code gepackt und es kam auch kein fehler von wegen nicht gefunden.



  • floorball92 schrieb:

    Habe ich, habe #include <sqlite3.h> in den Source Code gepackt und es kam auch kein fehler von wegen nicht gefunden.

    das reicht aber nicht. die .c-dateien müssen auch dabei sein (oder das ganze in form einer library oder object-files). sonst findet der linker die funktionen nicht. welche IDE benutzt du?
    🙂



  • zur Zeit Pelles C, aber downloade gerade Microsoft Visual C++ weil es zu Pelles C nicht wirklich Hilfe gibt und es ein reiner C Compiller ist.



  • floorball92 schrieb:

    zur Zeit Pelles C, aber downloade gerade Microsoft Visual C++ weil es zu Pelles C nicht wirklich Hilfe gibt und es ein reiner C Compiller ist.

    der download einer neuen entwicklungsumgebung samt tools wird dein aktuelles problem sicherlich nicht lösen.
    übrigens: pelles-c ist gar nicht so schlecht.
    🙂



  • Benutzt du Pelles C??

    Und wie biinde ich die anderen jetzt ein, als Lib zum Beispiel.



  • guenni81 schrieb:

    Zieh dir das Paket von sqlite.org, da ist die sqlite3.h. dabei

    auf der homepage findest du alles: Source Code, precompiled binaries, die DLLs, die amalgamation-version, die super zum Einbinden im eigenen Projekt ist. Wer liest ist klar im Vorteil, sagt man.



  • supertux schrieb:

    auf der homepage findest du alles: Source Code, precompiled binaries, die DLLs, die amalgamation-version, die super zum Einbinden im eigenen Projekt ist. Wer liest ist klar im Vorteil, sagt man.

    Das ist die Ironie des Schicksals.

    Dann solltest du auch mal lesen, wie gesagt verstehe ich das nicht, weil mein English dafür nicht gut genug ist.



  • und was gibt es da zu verstehen? Du musst keinen Roman lesen sondern 2 Zeilen Englisch. Wer sich mit einer Programmiersprache auseinander setzt, wird vermutlich "Precompiled Binaries For Windows" und "Source Code" verstehen koennen, oder?

    //edit:

    Dann solltest du auch mal lesen, wie gesagt verstehe ich das nicht, weil mein English dafür nicht gut genug ist.

    und wo hast du gesagt, dass du Englsich Probleme hast? Du hast geschrieben: "Die Grundlaen der Englischen Sprache habe ich ja, aber das verstehe ich einfach nicht." das hoert sich fuer mich so an, als koenntest du nicht verstehen, wie man die Bib. benutzt (daher mein Bsp).



  • floorball92 schrieb:

    Benutzt du Pelles C??
    Und wie biinde ich die anderen jetzt ein, als Lib zum Beispiel.

    ja manchmal, ich hab mal zum spass sqlite3.c runtergeladen und in ein pelles-c projekt eingebunden. bis auf ein paar warnings, dass sqlite3.c einige objekte definiert, aber nie verwendet, compiliert es durch.
    hier ist das project-file:

    # 
    # PROJECT FILE generated by "Pelles C for Windows, version 5.00".
    # WARNING! DO NOT EDIT THIS FILE.
    # 
    
    POC_PROJECT_VERSION = 5.00.1#
    POC_PROJECT_TYPE = 3#
    POC_PROJECT_ARGUMENTS = #
    POC_PROJECT_WORKPATH = #
    POC_PROJECT_EXECUTOR = #
    CC = pocc.exe#
    AS = poasm.exe#
    RC = porc.exe#
    LINK = polink.exe#
    SIGN = posign.exe#
    CCFLAGS = -Tx86-coff -W1 -Gd -Ze #
    ASFLAGS = -AIA32 -Gd#
    RCFLAGS = #
    LINKFLAGS = -machine:ix86 -subsystem:console kernel32.lib advapi32.lib delayimp.lib#
    SIGNFLAGS = -location:CU -store:MY -timeurl:http://timestamp.verisign.com/scripts/timstamp.dll -errkill#
    INCLUDE = $(PellesCDir)\Include\Win;$(PellesCDir)\Include#
    LIB = $(PellesCDir)\Lib\Win;$(PellesCDir)\Lib#
    
    .SILENT:
    
    # 
    # Build sqlite_test.exe.
    # 
    sqlite_test.exe: \
    	output\test.obj \
    	output\sqlite3.obj
    	$(LINK) $(LINKFLAGS) -out:"$@" $**
    
    # 
    # Build test.obj.
    # 
    output\test.obj: \
    	test.c \
    	sqlite3.h
    	$(CC) $(CCFLAGS) "$!" -Fo"$@"
    
    # 
    # Build sqlite3.obj.
    # 
    output\sqlite3.obj: \
    	sqlite3.c
    	$(CC) $(CCFLAGS) "$!" -Fo"$@"
    
    .EXCLUDEDFILES:
    

    🙂



  • habe dein PROJEKT File mal genommen, hat aber nichts geholfen.



  • floorball92 schrieb:

    habe dein PROJEKT File mal genommen, hat aber nichts geholfen.

    hast du die sqlite3.c mit eingebunden? oder nur die .h?
    was zickt denn jetzt?
    mir scheint dass dir noch ein paar zusammenhänge nicht klar sind.
    🙂



  • joa, glaube auch, denke mal ich werde einfach die 3 Wochen warten und mir das dann von meinem Bekanntn in Ruhe erklären und zeigen lassen, dann muss ich euch nicht ständig nerfen. Denke werde bis dahin auch mit Textdateien auskommen.



  • floorball92 schrieb:

    ...dann muss ich euch nicht ständig nerven.

    konkrete fragen kannste hier ruhig stellen. das nervt keinen und dafür ist so'n forum auch da.
    🙂


Anmelden zum Antworten