Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Interbase und Felder die NICHT null sein dürfen (https://www.delphipraxis.net/24443-interbase-und-felder-die-nicht-null-sein-duerfen.html)

Albi 21. Jun 2004 07:58


Interbase und Felder die NICHT null sein dürfen
 
Guten morgen,

Ich habe eine IB-DB und will, das mir die Datenbank eine Fehlermedlung ausgib wenn Felder die "Not Null" deklariert sind nicht mit einem Wert besetzt worden sind.

Wenn ich das direkt auf der DB ausprobiere gib es eine Fehlermeldung, wenn ich jedoch das vom Programm aus mache werden diese Einstellungen einfach übergangen. Woran liegt das?

Ich verwende zum einfügen der DS eine StoredProc, liegt daran und ich sollte besser eine DataSet-Kompo nehmen?

Danke

shmia 21. Jun 2004 10:29

Re: Interbase und Felder die NICHT null sein dürfen
 
Die Datenbank sorgt in jedem Fall dafür, dass Felder mit dem Attribut NOT NULL einen gültigen Wert erhalten. Sie schützt also ihre Tabellen vor ungültigen Daten, gleichgültig ob deine
Andendung das mitbekommt oder nicht.

Jetzt kommt es natürlich darauf an, was in deiner Stored Procedure drin steht.

> Ich verwende zum einfügen der DS eine StoredProc, liegt daran und ich sollte besser eine
> DataSet-Kompo nehmen?
Man kann nicht sagen, dass eine Dataset-Komponente besser wäre, allerdings ist der Zugriff
auf die Tabellen direkter (aber nicht unbedingt schneller) und damit solltest du Einfüge- oder Update-Fehler direkt als Exception geliefert bekommen.

Albi 21. Jun 2004 11:38

Re: Interbase und Felder die NICHT null sein dürfen
 
Gib es denn eine Möglichkeit, eine Excepion der DB an den Client zu senden?

Ich habe in meiner DB das Feld PlzOrtID, wenn ich direkt auf der DB arbeite und die Felder einfüge und das Feld PlzOrtID keinen Wert enthält bekomme ich ne Meldung. Wenn ich jedoch die Felder aus dem Client heraus ausfülle und ich lasse dort die Eingabe für die PlzOrtID weg, dann wird in der DB das Feld Feld einfach "NULL" eingetragen und das sollte doch eigentlich nicht sein.

Wie kommt das, das die DB selber da meckert aber den Client anscheinend egal ist?

shmia 21. Jun 2004 12:22

Re: Interbase und Felder die NICHT null sein dürfen
 
Zitat:

Zitat von Albi
Gib es denn eine Möglichkeit, eine Excepion der DB an den Client zu senden?

Üblicherweise werden Fehlermeldungen vom Datenbanktreiber auf der untersten Ebene über Returncodes zurückgegeben.
Die Kapselung, die die VCL um die Treiber legt, übersetzt diese Returncode in Exceptions.
Du als Anwender der Datenbank-Komponenten brauchst dich darum eigentlich gar nicht zu kümmern.
(Es sei denn, die Komponenten arbeiten nicht "Delphi-like")

Zitat:

Zitat von Albi
Ich habe in meiner DB das Feld PlzOrtID, wenn ich direkt auf der DB arbeite und die Felder einfüge und das Feld PlzOrtID keinen Wert enthält bekomme ich ne Meldung. Wenn ich jedoch die Felder aus dem Client heraus ausfülle und ich lasse dort die Eingabe für die PlzOrtID weg, dann wird in der DB das Feld Feld einfach "NULL" eingetragen und das sollte doch eigentlich nicht sein.

Das darf eigentlich überhaupt nicht passieren !!
Zum Test, dass du keinem Irrtum unterliegt probiere Folgendes:
Erzeuge mit deiner Anwendung einen Datensatz, der im Feld PlzOrtID den NULL-Wert enthält.
Gehe direkt auf die Datenbank (mit IBconsole, oder ?) und ändere ein anderes Feld (z.B. Ortsname)
und bestätige die Änderungen. Nun sollte die Fehlermeldung betreffend PlzOrtID kommen.
Ein Stringfeld kann einen leeren String enthalten oder es kann den Inhalt 'Null' enthalten,
das ist aber nicht das gleiche wie der echte NULL-Wert.
Also versuche auch mal mit IBConsole den Inhalt "NULL" zu editieren, sollte das gelingen, handelt
es sich einfach um einen String, der zufällig den Inhalt "NULL", aber nicht um den echten NULL-Wert.

Versuche auf jeden Fall die neuesten Treiber sowie evtl. ein Update für IB aus dem Internet zu ziehen.

Albi 21. Jun 2004 12:42

Re: Interbase und Felder die NICHT null sein dürfen
 
Genau das was du eben beschrieben hast, mit der IBConsole, ist ja mein Problem. Die DB erkennt das richtig.

Also gib der Client keinen richtigen NULL-Wert zurück sondern einfach nur NULL. Somit ist es für die Korrekt obwohl es doch nicht korrekt ist. :wall:

Zur veranschaulichung, ich habe in meinem Prog das Feld PLZ und eine CBBox Ort (eine Table Stammdaten und PLZOrt). Ich gebe eine PZL und beim verlassen werden alle Orte in die CBBox eingetragen die zur PLZ passen. Wenn ich nun in CBBox einen Ort aussuche, wird über das onChange-Ereignis die Entsprechende ID der PLZ-Ort Kombination aus der Table PLZOrt gesucht und soll in Table Stammdaten gespeichert werden. Wenn nun aus irgendeinem Grund die ID fehlt sollte es einen Fehler geben aber in der entsprechenden Spalte der Table steht dann "NULL".

Ich will jetzt wissen, wie das verhindern kann. Ich dachte erst es liegt einfach an kommunikation zwischen der DB und dem Client aber es scheint doch mein Fehler zu sein.

Danke


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:26 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz