sqlite std::logic_error
-
Hi. Ich habe einen echt komischen Fehler, der auch nur auftritt wenn ich aus der Entiwcklung herraus F5 drücke zum Ausführen. Die Exe sagt nichts.
Ich erhalte immer eine std::logic_error Exception.
Nur eben nicht nachvollziehbar.
// Diese Zeile erzeugt keine Fehlermeldung sqlite_result result = db->query("SELECT A,B,C FROM Main WHERE 1"); // Fehlermeldung: std::logic_error sqlite_result result = db->query("SELECT * FROM Main WHERE 1");Am Sternchen kanns auch nicht ganz liegen, denn es gibt auch Tabellen indem nur die ersten 5 Spalten abfragen kann und weitere Spalten oder * ebenfalls den obigen Fehler produzieren. Kann irgendwer dazu was sagen und weiterhelfen?
sqlite_result sqlite_db::query(const string &query) { sqlite_result result; if (db) { try { char *errmsg = NULL; int res = sqlite3_exec(db,query.c_str(),sqlite_callback,(void*)&result,&errmsg); if (res == SQLITE_OK) { return result; } } catch(...) { } } return result; }
-
Lass mal das WHERE 1 weg (was auch immer das bewirken soll).
-
Die WHERE 1 ist sowas standardartiges in MySQL.
db->query("SELECT * FROM Main");macht selben Fehler
Hier noch bissle mehr Code.
typedef map<string,string> sqlite_fields; typedef vector<sqlite_fields> sqlite_result;int sqlite_db::sqlite_callback(void *param,int colcount,char **cols,char **colnames) { try { sqlite_result *result = reinterpret_cast<sqlite_result*>(param); sqlite_fields f; for (int i=0;i<colcount;++i) { f[colnames[i]] = cols[i]; } result->push_back(f); } catch (...) { } return 0; }
-
bugsu schrieb:
Die WHERE 1 ist sowas standardartiges in MySQL.
Das wage ich zu bezweifeln... Außerdem verwendest Du doch SQLite und nicht MySQL.
Und wieso mit F5 starten? Bei mir öffnet F5 den Suchen-Dialog?!? Welche IDE verwendest Du? Wieso verwendest Du keine Zugriffskomponenten? Was passiert wenn Du den SELECT direkt auf die DB los lässt (es gibt doch bestimmt irngendein Verwaltungstool zu SQLite, mit dem das möglich ist)?
-
@WHERE
Ist zumindest in phpmyadmin so standard wenn man SQL Befehle ausführen will. SOllte jetzt aber kein Diskussionsthema sein da "Where 1" letztendlich das gleiche macht und wie geschweifte Klammern lediglich etwas verdeutlicht.Ich glaub ich weiss nun was der Fehler ist.
In bestimmten Spalten steht in bestimmten Zeilen (soll auch so sein) kein Inhalt und wird somit als NULL dargestellt.Also in Spalte A steht in Zeile 2 eine String "hello world!" aber in Zeile 3 von Spalte A steht NULL. Genau darüber stolpert er wohl.
Ich habe das jetzt so angepasst.
for (int i=0;i<colcount;++i) { if (cols[i]==NULL) cols[i] = ""; // << vorher Abfragen, on NULL-Wert f[colnames[i]] = cols[i]; }Lösung soweit OK, oder meint wer das ginge anders besser?
-
Joe_M. schrieb:
bugsu schrieb:
Die WHERE 1 ist sowas standardartiges in MySQL.
Das wage ich zu bezweifeln... Außerdem verwendest Du doch SQLite und nicht MySQL.
Dieses WHERE TRUE verwenden Programmierer gerne, um sich das Filtern von Datensätzen einfacher zu machen:
<< SELECT * FROM mytable WHERE true
if (nach FilterA soll gefiltert werden) << AND filterA=...
if (nach FilterB soll gefiltert werden) << AND filterB=...Man muss sich nicht merken, ob die Bedingung mit WHERE oder AND einzuführen ist. Is O.K. so.
Hast Du mal mit dem Debugger in sqlite_callback geschaut, was colcount liefert? Was ist sqlite_fields für ein Typ?
O.K. dann bildert er wohl DB-Null damit ab. Dann lass' es so.
-
typedef map<string,string> sqlite_fields; typedef vector<sqlite_fields> sqlite_result;Er wird wohl NULL zurückerhalten. Damit habe ich es ja nun gefixt (siehe Beitrag darüber)
Mit Debbuging hab ichs net so
ich mach das mit auskommentieren und Var-Anzeigen. *Asche auf mein Haupt*
Wenn mir wer erklärt wie ich das mit Debug rausfinde wäre natürlich ganz klasse. Ist ja nicht das erste mal das man auf nen Fehler stösst.
-
Zum Thema Debuggen hat junix die Grundlagen hier zusammengefasst: http://www.junix.ch/bcb/help/debug.html
Und das WHERE 1 ist nicht ok.
Sowohl unsere informix-, als auch unsere MS-SQL 2005-Datenbank liefern dabei einen Fehler. Und nur um sich eine Zeile Quellcode zu sparen, gehe ich nicht das Risiko ein, dass eine Abfrage auf bestimmten Datenbanken nicht läuft...
-
Hallo
SELECT x FROM y WHERE 1;PostgreSQL :
FEHLER: Argument von WHERE muss Typ boolean haben, nicht Typ integer
MySQL :
korrektWenn diese Vereinfachung fürs Queryzusammenbauen gewollt ist dann wenigstens so :
... WHERE 1 = 1bis bald
akari