Problem mit SQL Abfrage (Format DATE & CString)
-
Guten Morgen,
ich habe ein Problem und nach LÄNGERE Suche im Internet noch keine wirkliche Lösung gefunden.Also was habe ich.
Ich habe eine Access Datenbank auf die ich über ODBC zugreife. Ich kann schreiben und lesen ALLES WUNDERBAR. Habe mir eigene Datensets angelegt.
Nun mein Problem ich habe eine Tabelle mit Rechnungsbuchungen und benutzte das Feld: [datum] als Schlüssel.Nun lese ich das Feld [datum] was NATÜRLICH vom Typ Date ist aus der DB aus einer Tabelle aus und will es nun in meinem Programm benutzen um mit einer Funktion get BuchungsDaten(datum) alle Daten dieser Buchung zu erhalten.
Nun mein Problem:
Ich habe einen String -> cSQLBefehl den ich mir immer zusammen baue. Sieht dann so aus:cSQLBefehl = "SELECT * from buchung WHERE datum=";
cSQLBefehl = cSQLBefehl + cDatumwobei ich cDatum dann schon auf CString umgestezt habe.
Habe es auch schon mit Doppelhäckchen und einfach Häckchen versucht. Also sprich so:cSQLBefehl = "SELECT * from buchung WHERE datum='";
cSQLBefehl = cSQLBefehl + cDatum;
cSQLBefehl = "'";und so auch:
cSQLBefehl = "SELECT * from buchung WHERE datum=´";
cSQLBefehl = cSQLBefehl + cDatum;
cSQLBefehl = ´";und so erst recht
cSQLBefehl = "SELECT * from buchung WHERE datum=\"";
cSQLBefehl = cSQLBefehl + cDatum;
cSQLBefehl = "\"";Nun hab ich schon rausgefunden, dass es am DATE Format der AccessDB liegen muss weil ich nen CATCH Fehler zurück bekomme. Wie kann ich das umgehen, hab mir schon gedacht, daß ich in der DB das Feld datum einfach als Text also als String definiere und in meinen Datensets auch den Datentyp ändere, wäre mir aber ein richtig großer Dorn im Auge weil ich ein verfechter von "richtigen" Datentypen bin und ein Datum/Uhrzeit in einem String und nicht im Date bzw Time Format zu speichern is doch scheiße oder???
Wenn ich gleich meinen USB Stick lokalisiert hab kann ich auch nochmal original Code und Original ODBC Fehlermeldung posten.
Also mein CODE Ausschnitt sieht wie folgt aus:
// Datenbestand oeffnen
sqlBefehl = "Select * FROM [Buchungen] WHERE datum='";
sqlBefehl = sqlBefehl + cDatum;
sqlBefehl = sqlBefehl + "'";
openDatasetBuchungen(sqlBefehl);cDatum wird dieser Funktion übergeben und ist vom Typ CString und ich lese diesen ja vorher aus dem Feld aus der DB aus. Also müsste er eigentlich die richtige DatumsFormatierung besitzen oder bin ich da auf dem Holzweg???
// Datenbestand oeffnen
sqlBefehl = "Select * FROM [Buchungen] WHERE datum='";
sqlBefehl = sqlBefehl + cDatum;
sqlBefehl = sqlBefehl + "'";
openDatasetBuchungen(sqlBefehl);DebugDurchlauf ergibt sqlBefehl hat folgenden Inhalt:
Select * FROM [Buchungen] WHERE datum='2007-09-20 16:50:55'und als Fehlermeldung bekomme ich:
Datentypen in Kriterienausdruck unverträglichmit folgedem Code:
// Datenbestand oeffnen
sqlBefehl = "Select * FROM [Buchungen] WHERE datum=";
sqlBefehl = sqlBefehl + cDatum;
openDatasetBuchungen(sqlBefehl);DebugDurchlauf ergibt sqlBefehl hat folgenden Inhalt:
Select * FROM [Buchungen] WHERE datum=2007-09-20 16:50:55und als Fehlermeldung bekomme ich:
Systemfehler (fehlender Operator) in Abfrageausdruck ...also ist hier die Syntax schonmal ganz falschdann noch Code nummero 3
// Datenbestand oeffnen
sqlBefehl = "Select * FROM [Buchungen] WHERE datum=´";
sqlBefehl = sqlBefehl + cDatum;
sqlBefehl = sqlBefehl + "´";
openDatasetBuchungen(sqlBefehl);DebugDurchlauf ergibt sqlBefehl hat folgenden Inhalt:
Select * FROM [Buchungen] WHERE datum=´2007-09-20 16:50:55´da kommt gleich Syntaxfehler
...mhhh GRUMMEL!
-
Was passiert bei "WHERE datum=#01.01.2008#"? Das ist Access-Syntax. Weiss nicht, wieweit das bei ODBC verwendbar ist.
-
witte schrieb:
Was passiert bei "WHERE datum=#01.01.2008#"? Das ist Access-Syntax. Weiss nicht, wieweit das bei ODBC verwendbar ist.
WOW DANKE MEIN BESTER! Cool JETZT geht es!!! Ich freu mich wie bekloppt, hab sonst noch in 3 Foren nachgefragt da haben die mir Sachen gepostet ich solle das und dies erstellen und und und NETT wenn es auch mal einfach geht!
DANKE DIR !
-
Bei Postgresql geht "escaping" alternativ mit '$$' ist auch recht praktisch.
Nicht jede Datenbank unterstützt auch jedes Datumsformat, wie beispielsweiseDATE="28JUN 2008"
Eigentlich sollte xSQL == ySQL sein... teilweise ist man froh wenn eine Datenbank mehr als SQL92 unterstützt... doch das nur am Rande.