Problem mit einem Datum-Eintrag in eine SQL Datenbank
-
Hallo,
ich habe in meinem Programm eine SQL Datenbank. In dieser Datenbank gibt es eine Spalte mit der Bezeichnung Datum, die auch als datetime eingerichtet ist. Nun klappt aber der Eintrag von einem Datum in die Datenbank nicht. Hier mein Quelltext:TDadeTime Datum=DateTimeToStr(Now()); Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("INSERT INTO Tabelle1 (Datum)"); Query1->SQL->Add("VALUES ('"+TDateTime(Datum)+"')") Query1->ExecSQL;Die Fehlermeldung die nun kommt ist : Incorrect datetime value '23.01.2007 12:30:52' for columne 'Datum' at row 1
Kann mir jemand weiterhelfen???
Danke
-
Tja, dann schau Dir doch mal an, welchen String Du dort erzeugst.
Grundsätzlich kann ich nur empfehlen, Parameter zu verwenden. Vor ein paar Tagen gab es die gleiche Frage schon mal.
-
@carisma83
dieses Thema von dir beinhaltet alle notwendigen Informationen
-
So, hab das ganze jetzt mit Paramtern umgeschrieben:
Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("INSERT INTO Tabelle1 (Datum)"); Query1->SQL->Add("VALUES (:Datum)") Query1->ParamByName("Datum")->AsDateTime=DateTimeToStr(Now()); Query1->ExecSQL;Jetzt bekomme ich die Fehlermeldung: Operation not applicable
???
-
Ja, wie soll das denn auch funktionieren?!? Du verwendest als Parameter TDateTime, übergibst aber einen String? Schau Dir doch bitte noch mal die Beispiele von Linnea und mir an. Da steht doch, wie es richtig gemacht wird.
-
Hab emir das Beispiel angesehen aber wo ist denn der Unterschied?
Wenn ich in einer SQL Anweisung :Datum schreibe ist dann dies ein String? Was ist dann ein TDateTime???
-
carisma83 schrieb:
Hab emir das Beispiel angesehen aber wo ist denn der Unterschied?
Wenn ich in einer SQL Anweisung :Datum schreibe ist dann dies ein String? Was ist dann ein TDateTime???
Das Feld in der Datenbank ist DateTime. Dies kannst Du im der SQL-Anweisung natürlich auch als String angeben. Dann mußt Du aber selbst dafür sorgen, dass die Formatierung des Strings kompatibel zur Datenbank ist. Falls ein User in der Systemsteuerung irgendetwas am Format geändert hat, funktioniert das schon nicht mehr. Also verwendet man TDateTeme als Parameter (->AsDateTime). Deswegen kannst Du als Parameter keinen String verwenden, sondern mußt ein TDateTime-Objekt (TDateTime::Date oder TDateTeime::DateTime) verwenden. Der große Vorteil dabei ist, dass die Konvertierung in disem Fall immer korrekt funktioniert (da Du im Prinzip einen double Wert übergibst).
Query1->ParamByName("Datum")->AsDateTime = TDateTime::CurrentDate(); // oder TDateTime::CurrentDateTime()
-
Also ich habe jetzt den Quelltext genau so geschrieben wie du gesagt hast, der Fehler kommt aber trotzdem.
Noch zur Info: Ich benutze eine MySQL Datenbank, hat das was damit zu tun?
-
Hm, MySQL habe ich nicht ím Einsatz, aber bei informix, Firebird, Interbase und Access funktioniert das auf jeden Fall. Vielleicht gibt es bei MySQL eine Ausnahme, aber ich kann es mir kaum vorstellen.
Wie greifst Du denn auf die MySQL Datenbank zu? ODBC?
Query und DataSource sind korrekt verknüpft? ParamCheck der Query steht auf
true?
-
bei MySQL macht sich eine manuelle Datumsumwandlung besser, z.B.
String date = FormatDateTime("yyyymmddhhnnss", Now()); Query1->Close(); Query1->SQL->Clear(); Query1->SQL->Add("INSERT INTO Tabelle1 (Datum)"); Query1->SQL->Add("VALUES (:Datum)") Query1->ParamByName("Datum")->AsString=date; // oder ohne Parameter // Query1->SQL->Add("VALUES (" + date + ")"); Query1->ExecSQL();das ist zumindest meine Erfahrung mit MySQL