sqlite3 Problem



  • Hallo ich habe folgendes Problem und hoffe Ihr könnt mir helfen
    Ich Versuche sqlite in meinem Programm einzubauen. Ich bekomme aber schon beim öffnen

    "result = sqlite3_open("/Data/File/Sample1.db" , &Database);"

    einen Errorcode zurück

    "#define SQLITE_NOMEM 7 /* A malloc() failed */"

    könnt ihr mir helfen???

    #include "sqlite3.h"
    
    static int Callback( void *Pointer, int argc, char **argv, char **columnNames);
    
    static int Callback( void *Pointer, int argc, char **argv, char **columnNames) 
    { 
    	char Buff[81];
    	strcpy(Buff,*argv);
    
    	return 0; 
    } 
    void Test(void)
    {
    	int result;
    	sqlite3 *Database;
    
    	result = sqlite3_open("/Data/File/Sample1.db" , &Database);
    
    	if(result == 0)
    	{
    		// Tabelle anlegen und füllen: 
    		// (Da das nur Anweisungen sind, brauchen wir die Callbackfunktion nicht und lassen den 3ten Parameter auf "NULL")
    		sqlite3_exec( Database , "create table test(number integer , eintrag varchar(50) , primary key(number));" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (1 , 'Testeintrag');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (2 , 'Testeintrag 2');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (3 , 'Testeintrag 3');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (4 , 'Testeintrag 4');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (5 , 'Testeintrag 5');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (6 , 'Testeintrag 6');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (7 , 'Testeintrag 7');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (8 , 'Testeintrag 8');" , NULL , NULL , NULL);
    		sqlite3_exec( Database , "insert into test (number , eintrag) values (9 , 'Testeintrag 9');" , NULL , NULL , NULL);		
    
    		result = sqlite3_exec( Database , "select eintrag from test;" , Callback , NULL , NULL);
    
    	}
    	else
    	{
    		// Anfrage an Datenbank: Wir wollen alle Felder aus der Spalte "eintrag": 
    	}
    	// Das war`s, wir schließen die Datenbank: 
    	sqlite3_close(Database); 
    }
    


  • OS ? Sieht nach einem -x aus. Existiert das Verzeichnis ?
    Der Fehlercode heißt mit Sicherheit nicht "#define SQLITE_NOMEM 7 /* A malloc() failed */"



  • Ne, das ist schon richtig der rückgabewert von open ist 7 und beim nächsten Zugriff auf die Datenbank schmiert alles ab.

    Das Verzeichnis ist auch vorhanden.
    Danke für deine Antwort.



  • Na ja, dem sqlite_open übergibts Du ja nur 2 Sachen: den Datenbanknamen
    und die Adresse des db-Pointers wo er das Handle reinschreiben soll.

    Bleibt nur der Datenbankname als Verdächtiger. Da liegt der Hase im Kiesbett.

    Welches OS ? Zugriffsrechte auf das Verzeichnis ?
    Genug Speicher ? Platte voll ?



  • Dieser Thread wurde von Moderator/in Martin Richter aus dem Forum MFC (Visual C++) in das Forum Datenbanken verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Welches OS ?
    Ich benutze WinCE.

    Zugriffsrechte auf das Verzeichnis ?
    Ein einfacher Dateizugriff funktioniert im gleichen Verzeichnis.

    Genug Speicher ? Prüfe ich gerade aber die Datei ist nur 600kB groß.

    Platte voll ? Platte ist definitiv nicht voll

    Gruß Sitt0030



  • http://de.wikipedia.org/wiki/Microsoft_Windows_CE

    Eine der wichtigsten Änderungen, die Windows CE 5.0 mitbringt, betrifft den Speicher: Der interne Datenspeicher befindet sich nicht mehr im flüchtigen RAM, sondern als sogenannter Persistent Storage im Flash-ROM, was nun vor Datenverlust schützt, wenn die Akku-Energie aufgebraucht ist. Außerdem lässt das nunmehr modular aufgebaute Betriebssystem im ROM erstmals ein selektives Update zu und muss nicht mehr komplett geflasht (überschrieben) werden, wenn der Hersteller bzw. OEM Bugfixes, Verbesserungen oder Ergänzungen anbieten will.

    Sagen wir mal, es gibt genug Fallen.

    also, was ist ?



  • Wird vermutlich am Problem nix ändern, aber ...

    void Test(void) 
     { 
         int result; 
         sqlite3 *Database = 0; // <----
    
         result = sqlite3_open("/Data/File/Sample1.db" , &Database); 
    
         if(result == 0) 
         { 
             // ...
    
             // Das war`s, wir schließen die Datenbank: 
             sqlite3_close(Database); // <---- 
         } 
         else 
         { 
             // Anfrage an Datenbank: Wir wollen alle Felder aus der Spalte "eintrag": 
             // Wie wo was huch?
             // Nix Anfrage an Datenbank, wir haben hier nämlich keine Datenbank!
         } 
     }
    


  • sqlite3 *Database = 0; // <----
    

    In Database schreibt sqlite das Handle rein, das isses nich ...

    Der OP könnte ja einfach mal im Quellcode sqlites nachsehen wann es die
    Meldung absetzt.



  • Scheppertreiber schrieb:

    sqlite3 *Database = 0; // <----
    

    In Database schreibt sqlite das Handle rein, das isses nich ...

    Ja, das ist mir auch klar 🙄
    Manchmal frag' ich mich echt ob ich hier von manchen für einen sabbernden Vollidioten gehalten werde.

    Die Sache ist die: garantiert SQLite dass sämtliche Output-Parameter immer, d.h. auch im Fehlerfall überschrieben werden? Und weiter: selbst wenn eine solche Garantie besteht, ist es dann guter Stil sich darauf zu verlassen?

    Jetzt könntest du sagen OK, gibt ja noch den Fehlercode, das wird ja wohl reichen. Tut es auch. Nur ... wenn ich für zwei Zeichen + ein Whitespace aus "gültig oder random, und damit wir wissen was von beiden müssen wir nochmal woanders nachsehen" ein "gültig oder 0" machen kann... nen?

    ps:

    und beim nächsten Zugriff auf die Datenbank schmiert alles ab

    Ich behaupte mal das wird ganz einfach daher kommt, weil der OP einen Schrottzeiger übergibt. NULL Werte fängt sqlite nämlich ab. Wenn man aber nicht für "gültig oder 0" sorgt, ...



  • Ob Du sabberst kann ich nicht wissen und Vollidioten könne kein Forum bedienen 😉

    Der OP bekommt ja von sqlite gesagt "mit dem open war's nix". Klar schmiert
    es ab wenn man das ignoriert. Die Fehlermeldung ist eigentlich auch klar. Mit
    WinCE hatte ich noch nichts zu tun, packt das nochmal 600 KB Daten ? Und wo
    will er die herhaben ?



  • Ich finde keinen Fehler der Speicher ist auch ok.

    Ich habe mal Herrn Google gefragt und folgendes gefunden.

    [sqlite] sqlite3_open returns
    SQLITE_NOMEM
    Ryan Clark
    Wed, 25 Jun 2008 17:41:31 -0700
    This is a "known" issue.

    http://www.sqlite.org/cvstrac/tktview?tn=2508,6

    The fix is to include SYSGEN_CORELOC.
    Can someone mention that in the documentation somewhere?
    Ryan

    Kann mit das einer erklären??
    Sitt0030



  • Windows CE baut man sich ja selber, anscheinend mit einem Tool Namens "sysgen", und da musst du das SYSGEN_CORELOC Flag setzen, damit es im gebauten Windows CE dann das entsprechende Paket gibt. Oder so hänlich. Klick halt auf den MSDN Link der in dem Bug-Ticket verlinkt ist.

    Ansonsten schreib die Funktion einfach so um (bzw. neu) dass sie MultiByteToWideChar nicht mehr verwendet. Da wird bloss UTF-8 nach UTF-16 konvertiert, und das ist ziemlich easy und schnell ergoogelt.

    Evtl. musst du noch weitere Stellen anpassen wo MultiByteToWideChar verwendet wird.



  • Danke für euere Hilfe ich werde mal die Infos von hustbaer realisieren und meine Ergebinsse hier berichten.



  • Ich habe es geschaft. Einfach in der SQLite.c "CP_UTF8" durch "CP_ACP" ersetzen eine neue *.lib erzeugen und es geht. 😃

    Danke noch einmal Hustbaer


Anmelden zum Antworten