sqlite3 Problem
-
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?
RyanKann 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