Hallo Zusammen,
ich will Daten in einer sqlite Datenbank, die sich auf einer SD-Karte die wiederum an einem ESP8266 WEMOS D1 mini Modul angeschlossen ist benutzen.
Die Datenbank (Tabellen, Indexe usw.) habe ich zuvor mit dem SQLite Studio erstellt und auch die empfohlene Blockgröße von 512 eingestellt und den vacuum befehl zum aufräumen abgesetzt.
Die Stacksize habe ich bereits in der esp8266/cont.h Datei auf den Wert von 6144 gestellt.
Soweit funktioniert der zugriff auf die Datenbank auch vom ESP8266. Ich kann die Datenbank öffnen und auch SELECT Befehle absetzen.
Wenn ich jedoch einen INSERT INTO Befehl absetzen möchte bekomme ich die Rückmeldung "Out of Memory".
Ich bin mittlerweile am Ende und frage mich ob mir hier jemand einen Tipp geben kann wo ich suchen kann.
In der folgenden Funktion soll in der Datenbank ein neues Material angelegt werden. Der obere SQL-Befehl wird problemlos ausgeführt, sobald aber der INSER Befehl kommt bekomme ich einen Fehler zurück:
int AddMaterial(sqlite3 **db, String bez, String besch, String einh, double umr){
sqlite3_stmt *res;
const char *tail;
char *err_msg=0;
String sql;
int rc;
long nummer;
//Letzte Materialnummer auslesen
sql = "SELECT MAX(nummer) FROM material\0";
rc = sqlite3_prepare_v2(*db, sql.c_str(), -1, &res, &tail);
if (rc != SQLITE_OK) {
Serial.println(sql);
String resp = "Failed to fetch data: ";
resp += sqlite3_errmsg(*db);
Serial.println(resp.c_str());
sqlite3_finalize(res);
return(1);
}
while (sqlite3_step(res) == SQLITE_ROW) {
nummer = sqlite3_column_int(res, 0) + 1;
}
sqlite3_finalize(res);
// Den Materialstammdatensatz hinzufügen
sql = "INSERT INTO material(nummer,bezeichnung,beschreibung,einheit,umrechnung) VALUES(";
sql = sql + nummer + ",'" + bez + "','" + besch + "','" + einh + "'," + umr;
sql += ");\0";
rc = sqlite3_prepare_v2(*db, sql.c_str(), -1, &res, &tail);
if ((rc = sqlite3_step(res)) != SQLITE_DONE) {
Serial.println(sql);
String resp = "Failed to insert data: ";
resp += sqlite3_errmsg(*db);
resp += "\n rc=";
resp += rc;
Serial.println(resp.c_str());
sqlite3_finalize(res);
return(2);
}
sqlite3_finalize(res);
return(0);
}
Die Ausgabe über die Serielle Schnittstelle sieht dann so aus:
21:36:00.907 -> INSERT INTO material(nummer,bezeichnung,beschreibung,einheit,umrechnung) VALUES(1012,'Testmat','Ein neues Material','EI',1.00);
21:36:00.907 -> Failed to insert data: out of memory
21:36:00.907 -> rc=7
Ich bin auch der Meinung das ich noch genügend freien Speicher habe wenn ich mir das Compile-Ergebnis ansehe:
Ich habe irgendwo gelesen das so um die 20kByte Speicher frei seien sollten.
Ich habe schon diverse Dinge versucht:
- Das generierte INSERT SQL-Statement direkt in der Datenbank abgesetzt -> Funktioniert
- Die Bestimmung der Abfrage der letzten Nummer in das SQL-Statement der INSERT Anweisung integriert: Hier bekomme ich die Rückmeldung: parser stack overflow:
21:21:07.812 -> INSERT INTO material(nummer,bezeichnung,beschreibung,einheit,umrechnung) VALUES(((SELECT MAX(nummer) FROM material)+1),'Testmat','Ein neues Material','EI',1.00);
21:21:07.812 -> Failed to insert data: parser stack overflow
- Den INSERT Befehl mit "sqlite3_exec" abzusetzen -> hier bekomme ich auch die out of memory Meldung.
Hat vielleicht jemand SQLITE3 im Einsatz und kann mir einen Tipp geben wo ich noch schauen kann?
Vielen Dank für alle Hinweise und Tipps,
Artur
