SQlite



  • HI, hab mir von http://www.sqlite.org/download.html folgenden Source geladen:
    "sqlite-source-3_3_3.zip" entpackt und den unteren C-Code genommen von http://www.sqlite.org/quickstart.html
    Dabei habe ich max. die Zeile geändert: "#include <sqlite3.h>" in #include "sqlite3.h"

    Aber beim kompilieren zeigt er mir folgende Fehler:

    Anfang1.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sqlite3_exec
    Anfang1.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sqlite3_close
    Anfang1.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sqlite3_errmsg
    Anfang1.obj : error LNK2001: Nichtaufgeloestes externes Symbol _sqlite3_open

    Habe schon allen möglichen Code von der Seite geladen, immer das selbe, was mache ich falsch? Nutze Visual Studio 6



  • Irgendwo (vermutlich in der Zip-Datei) sollten auch ein paar .lib Dateien sein - trag mal den Pfad dorthin in deine Projekteinstellungen (unter Linker - Bibliothekspfade) ein.



  • Alle möglichen Sourcearchive entpackt, weder *.dll, *.lib oder *.so
    Ich werd verrückt ...



  • Wenn Du von SQLite den SOURCE geladen hast, musst Du daraus erstmal eine .dll oder .lib kompilieren, bevor Du versuchst die zu benutzen!



  • Habe jetzt in VS ein neues DLL Projekt gemacht, da die jeweiligen Dateien in die Quellcode- und Headerordner eingefügt und er konnte eine dll erstellen. Habe diese dann im Projekt bei den Einstellungen>Debug und zusätzliche DLLs eingefügt und zusätzlich beim Linker den Namen eingetragen, wo halt alle DLL und lib undso eingetragen sind.
    Aber jetzt beim Linken kommt:
    "test.dll : fatal error LNK1136: Ungueltige oder beschaedigte Datei"
    Die test.dll ist die erstellte aus dem Sourcecode, aber weiss nicht was da falsch ist..



  • Beim Erstellen der .DLL müsste der Compiler dir auch eine .LIB erzeugt haben. Die .LIB musst Du mit dem anderen Projekt linken, nicht die .DLL selbst.

    Die .DLL muss später nur im selben Verzeichnis wie die .EXE oder in einem Systemverzeichnis (eines aus %PATH%) liegen..



  • Habe es endlich hinbekommen, halleluja 🙂

    p.s. aber warum kann sowas nicht einfach normal erklärt werden? OK es gab son makefile, aber ich wusste net wozu ich das brauch, dass erstmal ne lib/dll erstellt werden muss?



  • Das Makefile ist sicher für Linux/UNIX. Da macht man dann wahrscheinlich den Zweierschritt make / make install und hat's systemweit installiert (ok, ist bei MinGW nicht anders).

    Da SQLite eine sehr schlanke Bibliothek ist die (fast?) nur mit ANSI-Funktionen auskommt, hast Du das Glück dass sich das sehr einfach auf Windows bauen lässt. Wenn da wirklich kein Projektfile für VS bei ist, gibt es vermutlich irgendwo im Internet Portierungshinweise oder gar ein fertig kompiliertes .LIB/.DLL Paket für Win32... (nicht zwangsläufig bei den Betreibern der SQLite Homepage!)



  • nunja, es "geht" jetzt, aber wie erstelle ich nun unter C eine Tabelle oder nutze diese anderen Befehle? Weil es gibt zwar diese Version, wo es kompiliert ist, aber ich will da direkt durch C im Quellcode z.b. durch ein Menü eine Tabelle erstellen lassen.

    Da habe ich den Befehl "SQLITE_CREATE_TABLE" gefunden. Aber ich bekomme die übergebenen Argumente nicht hin, hier der Code:

    #include <stdio.h>
    #include "header\sqlite3.h"
    #include <stdlib.h>
    #include <conio.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;
      char *zErrMsg = 0;
      int rc;
      if( argc!=3 ){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
    	SQLITE_CREATE_TABLE [db.]a (sql INTEGER PRIMARY_KEY);
        getch();
       exit(1);
      }
      rc = sqlite3_open(argv[1], &db);
      if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        getch();
        exit(1);
      }
      rc = sqlite3_exec(db, argv[2], callback, 0, &zErrMsg);
      if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
      }
      sqlite3_close(db);
      getch();
      return 0;
    }
    

    Und in der SQLITE_CREATE_TABLE ANweisung bekomm ich den Fehler
    "error C2059: Syntaxfehler : ']'"
    Habe schon alles mögliche versucht, aber finde nichts mehr, auch in den Headers gesucht, aber nichts gefunden, welche Argumente ich übergeben soll. Wie es in SQL ist geht da nicht, dass ich CREATE TABLE blabla schreibe, da findet er CREATE nicht!
    AUf der Website bei Documentation oder so habe ich zwar erklärungen zu den Syntax gefunden, auch zu CREATE Table, aber die bezogen sich alle direkt auf SQL, was mir in C aber recht wenig bringt, wie ich oben schon sagte, CREATE TABLE in C endet mit nichtdeklarierter Bezeichner CREATE und TABLE!

    Hoffe ihr versteht mich 😃



  • Also der Compilerfehler ist irgendwo klar, die ganze Zeile ergibt als C Syntax irgendwie nicht viel Sinn.. Also weg damit 😉

    Das Beispiel was Du benutzt ist für den Anfang schon ganz gut, wenn Du verstanden hättest dass der zweite Aufrufparameter (des Programms) der SQL Befehl sein soll. Du kannst dort jeden SQL-Befehl als Stringliteral angeben.

    Alles in allem siehts dann etwa so aus:

    #include <stdio.h>
    #include "header\sqlite3.h"
    #include <stdlib.h>
    #include <conio.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;
      char *zErrMsg = 0;
      int rc;
      const char *query = 
      "CREATE TABLE my_table ("
      "  id INT NOT NULL PRIMARY KEY,"
      "  name VARCHAR(255) NOT NULL,"
      ")";
    
      if( argc!=3 ){
        fprintf(stderr, "Usage: %s DATABASE SQL-STATEMENT\n", argv[0]);
        getch();
        exit(1);
      }
    
      rc = sqlite3_open(argv[1], &db);
      if( rc ){
        fprintf(stderr, "Can't open database: %s\n", sqlite3_errmsg(db));
        sqlite3_close(db);
        getch();
        exit(1);
      }
    
      rc = sqlite3_exec(db, query, callback, 0, &zErrMsg); /* hier statt argv[2] query */
      if( rc!=SQLITE_OK ){
        fprintf(stderr, "SQL error: %s\n", zErrMsg);
      }
    
      sqlite3_close(db);
    
      getch();
      return 0;
    }
    


  • Hi!

    Ich wollte mir SQLite auch gerade kompilieren, die DLL hab ich von www.sqlite.org, den Source auch aber keine Lib! Ich habe auch die Quickstart gelesen und wollte danach vogehen.

    Beim kompilieren kam der Fehler, dass tcl.h fehlt.

    OK TCL ... tool command language

    Ich hab aber auf der Download-Seite unter www.sqlite.org eine DLL geladen, wo
    ich die TCL nicht brauche!
    Nun meine eigentliche Frage:

    Ich brauche ja eine Lib in meinem Code um die dll zu verwenden:
    Linux-Beispiel:
    gcc example.c -o example -l sqlite.lib

    (ich brauchs für Windows)

    Wenn ich nun SQLite kompilieren will, kann ich das nur mit TCL! Geht es auch irgendwie, dass ich eine LIB ohne TCL bekomme?

    Kann mir jemand vielleicht die kompilierte sqlite senden?

    mfg schne_re


Anmelden zum Antworten