2 Stimmen

Delphi - DateTime Null in DB speichern (ADO / MySQL)

Ich habe ein Delphi-Formular mit einigen DB-Steuerelementen auf sie.

Um ein Datum darzustellen, verwende ich die TJvDBDatePickerEdit (aus JCL), die eine schöne Eigenschaft hat

ShowCheckBox := True;

damit der Benutzer eingeben kann, dass kein Datum bekannt ist (DBNull).

Ich überprüfe, dass das Nullsetzen des DatePicker wie erwartet funktioniert:

procedure Tframe.adoQueryBeforePost(DataSet: TDataSet);
begin
  if (qryAuftraege.FieldByName('MyDateField').IsNull) then
  begin
    ShowMessage('IsNull!');
  end;
end;

Das Nachrichtenfeld zeigt an. Das Feld, das die ADO-Komponente schreiben soll, ist also vom Typ varNull.

Jetzt gibt es diese Pipeline:

TADOQuery -> TADOConnection -> MS OLE DB Provider for ODBC Drivers -> MySQL ODBC 5.1 Driver

Und der MySQL ODBC-Treiber wird jetzt in seinem Protokoll angezeigt:

UPDATE `db`.`table` SET `MyDateField`=_latin1'0004-00-00' WHERE `ID`=5 AND `MyDateField`=_latin1'2009-06-17';

Nun, das Datum wird gespeichert als '0004-00-00' (die MySQL so zu speichern scheint). Nun wird der Eintrag bei der Abfrage von Delphi als Null erkannt, aber wenn er das nächste Mal aktualisiert werden soll, wird er aufgerufen:

UPDATE `bvl`.`auftraege` SET `MyDateField`=_latin1'2009-06-17' WHERE `ID`=5 AND `MyDateField` IS NULL;

schlägt natürlich fehl, weil MyDateField NICHT NULL ist (zumindest in der MySQL DB).

Wo wird diese Zeichenfolge '0004-00-00' kommen? Wenn es irgendwo ein Fehler ist, wo könnte ich ihn möglicherweise abfangen?

Ich weiß bereits, dass es Komponenten zu kaufen gibt, die direkte MySQL-Verbindungen bereitstellen, die (so nehme ich an) dieses Verhalten nicht zeigen.

6voto

skamradt Punkte 15128

Um ein ungültiges Datum/eine ungültige Uhrzeit in einem Datenbankeintrag zu speichern, rufen Sie einfach

qryAuftraege.FieldByName('MyDateField').clear;

4voto

Francesca Punkte 21286

Stellen Sie sicher, dass Sie Ihre MySQL-Optionen wie besprochen überprüfen aquí ...

Dann würde ich versuchen, mit einem anderen Satz von Verbindungskomponenten als der Stapel (ADO + ODBC 5.1-Treiber) könnte das Problem hier.
Haben Sie es mit einem anderen ODBC-Treiber versucht? Oder mit DBX...

-1voto

José Romero Punkte 452

Ich weiß nicht, welche Auswirkungen das hat, aber ich habe immer

qryAuftraege.FieldByName('MyDateField').AsString:='';

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X