![]() |
Datenbank: ABS_Database • Version: 7.92 • Zugriff über: ABSTable
Tabellenfeld NOT NULL erkkennen
Hallo,
wie ermittelt man bei einem Datenbankfeld einer Tabelle, ob dieses Feld mit "NOT NULL" definiert wurde? Mittels
Delphi-Quellcode:
kann ich ja den Type ermitteln. Aber NOT NULL in der Deklaration des Feldes?
Dummy_String := GetEnumName(TypeInfo(TFieldType), Ord(ABSTable1.Fieldbyname('TestFeld').DataType));
Anmerkung: es ist schwierig, passende Ergebnisse mittels der Suche nach "NOT NULL" zu erhalten. LG Mathias |
AW: Tabellenfeld NOT NULL erkkennen
|
AW: Tabellenfeld NOT NULL erkkennen
Kann man über die Felddeklartionen abfragen: TFieldDef.Required
|
AW: Tabellenfeld NOT NULL erkkennen
Vielleicht mit
Delphi-Quellcode:
:?:
ABSTable1.Fieldbyname('TestFeld').Required
|
AW: Tabellenfeld NOT NULL erkkennen
Zitat:
|
AW: Tabellenfeld NOT NULL erkkennen
Danke für die Anregungen, ich gucke es mir morgen an.
LG Mathias 😀👋🏻 |
AW: Tabellenfeld NOT NULL erkkennen
Es kommt drauf an. entweder man kann selber Required setzen.
Aber viele DBKomponentenLibs setzen das auch auomatisch (z.B. von Devart), also bei einem
Delphi-Quellcode:
wird da von der DB der Status mit abgeholt und dieses Property entsprechend gesetzt, falls bei dem Tabellen-Feld in der DB ein "NOT NULL" deklariert wurde.
SELECT ... FROM
Aber man kann das Verhalten oft auch deaktivieren (oder vergesse zu aktivieren). Und es kann auch Nachteile haben, denn gibt es z.B. ein DEFAULT oder einen Trigger, welcher das Feld füllen würde, dann raucht TDataSet vorher schon ab, weil es davon nichts weiß. (theoretisch wäre es hier also möglich ein INSERT ohne das Feld, oder gar eine NULL zu posten, aber TDataSet bricht bereits im BeforePost ab, wenn IsNull und Required=True) |
AW: Tabellenfeld NOT NULL erkkennen
Zitat:
LG Mathias |
AW: Tabellenfeld NOT NULL erkkennen
Bin mir nicht sicher, ob das vor oder nach OnBeforPost passiert, aber Try-Except geht da drin eh nicht.
[EDIT] es wird nach OnBeforePost gepürft Aber beim .Post kannst ein Try-Except auf EDatabaseError machen, oder auf OnPostError reagieren.
Delphi-Quellcode:
procedure TDataSet.Post;
begin UpdateRecord; case State of dsEdit, dsInsert: begin DataEvent(deCheckBrowseMode, 0); DoBeforePost; CheckOperation(InternalPost, FOnPostError); // <----- FreeFieldBuffers; SetState(dsBrowse); Resync([]); DoAfterPost; end; end; end; procedure TDataSet.InternalPost; begin CheckRequiredFields; end; procedure TDataSet.CheckRequiredFields; var I: Integer; begin for I := 0 to FFields.Count - 1 do with FFields[I] do if Required and not ReadOnly and (FieldKind = fkData) and IsNull then begin FocusControl; DatabaseErrorFmt(SFieldRequired, [DisplayName]{, Self}); // k.A. warum Self auskommentiert ist, aber für die Fehlersuche wäre es eigentlich besser, wenn es das nicht wäre ... in XE auskommentiert und in 10.4 ganz weg o_O end; end; ... procedure DatabaseError(const Message: string; Component: TComponent = nil); begin if Assigned(Component) and (Component.Name <> '') then raise EDatabaseError.Create(Format('%s: %s', [Component.Name, Message])) else raise EDatabaseError.Create(Message); end; procedure TDataSet.CheckOperation(Operation: TDataOperation; ErrorEvent: TDataSetErrorEvent); var Done: Boolean; Action: TDataAction; begin Done := False; repeat try UpdateCursorPos; Operation; // <------ Done := True; except on E: EDatabaseError do begin Action := daFail; if Assigned(ErrorEvent) then ErrorEvent(Self, E, Action); // <------ if Action = daFail then raise; if Action = daAbort then SysUtils.Abort; end; end; until Done; end; // unit DBConsts; resourcestring SFieldRequired = 'Feld '#39'%s'#39' muss einen Wert haben'; |
AW: Tabellenfeld NOT NULL erkkennen
Das sieht doch gut aus.
Die Abfrage über das Feld
Code:
ist doch das, was ich gesucht habe.
if Required and not ReadOnly and (FieldKind = fkDat ..
Required das teste ich morgen, ob es öffentlich zugänglich ist und ob es denn Zweck erfüllt. Vielen lieben Dank. :-) Mathias |
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:59 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz