Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.016 Beiträge
 
Delphi 12 Athens
 
#7

AW: MS-Access 2016: VARCHAR mit Inhalt "" oder NULL

  Alt 22. Mai 2020, 19:56
SQL-Code:
CREATE TABLE mytable (
  field1 VARCHAR(255),
  field2 VARCHAR(255) DEFAULT '',
  field3 VARCHAR(255) NOT NULL,
  field4 VARCHAR(255) NOT NULL DEFAULT ''
);

-- fehlt field3/4, dann wird dort der DEFAULT genommen
-- field3 muß also immer übergeben werden, da es keinen DEFAULT hat und somit einen Wert benötigt
INSERT INTO mytable (field1, field3) VALUES ...;

-- hier müssen alle Felder übergeben werden und bei field3/4 dürfen keine NULL drin stehen
INSERT INTO mytable VALUES ...;

-- bei einigen DBMS kann man im INSERT und UPDATE auch "DEFAULT" angeben, selbst wenn das Feld angegeben wird
-- bei field4 ein NULL zu übergeben knallt natürlich
INSERT INTO mytable (field3, field4) VALUES ('aa', DEFAULT);

-- hier in einem Dataset.Insert, werden field2/3 niemals übergeben (fehlen im automatisch generierten INSERT und UPDATE)
-- die field1 und field4 werden nach einem Dataset.Insert nur übergeben, wenn dort etwas eingetragen wurde (siehe fehlen dann also auch und bekommen ihren DEFAULT, wenn vorhanden)
-- bei field3 wird es also knallen, da es NOT NULL ist und keinen DEFAULT hat
-- field4 wird beim Dataset.Insert nicht knallen, da es im automatischen INSERT fehlt, wenn dort nichts zugewiesen wurde, und somit der DEFUALT benutzt wird
-- aber wird beim Dataset.Edit (UPDATE) das field4 auf NULL gesetzt (und vorher war es nicht NULL), dann knallt das natürlich auch
SELECT field1, field4 FROM mytable;
Wer ein Feld mit NUL NULL mit DEFAULT nicht kennt, dem ist das also im Normalfall egal.

ABER, wenn hier SELECT * verwendet wird und das Dataset auf die TField.Requiered (NOT NULL) reagiert (dieses Required von der DB füllen lässt),
dann gibt es ein Problem, denn auf den DEFAULT reagieren viele DB-Komponenten nicht (weil sie es nicht kennen und nicht wissen, dass es zwar Required ist, aber spätestens in der DB doch einen Wert bekommen kann).
Ebenso ist es mit NOT NULL, wo der Wert im Trigger gefüllt wird. TDataSet weiß nichts davon und reagiert entsprechend auf das Requiered.
Bei uns wird aus Diesem und einem anderen Grund im Dataset.AfterInsert der DEFAULT-Wert aus der DB abgerufen und eingefügt.
* einmal gibt es dann nach DataSet.Insert beim Post keine Fehlermeldung "Feld muß gefüllt sein"
* und der Benutzer sieht auch sofort, wo bereits Default-Daten vorhanden sind, die ja sonst eigentlich erstmal leer sind und erst beim Speichern (Post) von der Datenbank gefüllt werden.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests

Geändert von himitsu (22. Mai 2020 um 20:21 Uhr)
  Mit Zitat antworten Zitat