AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken IBDAC: In der DB sind Leerstrings statt Null. Alternativen?
Thema durchsuchen
Ansicht
Themen-Optionen

IBDAC: In der DB sind Leerstrings statt Null. Alternativen?

Ein Thema von BlueStarHH · begonnen am 14. Okt 2010 · letzter Beitrag vom 7. Okt 2019
Antwort Antwort
Seite 3 von 3     123   
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#21

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 12. Sep 2019, 17:17
Es gibt noch eine Möglichkeit: Wert bekannt und kein Leerstring, besteht aber nur aus Leerzeichen.

So wie ich das verstanden habe, ist diese Vorgabe <Leerstring> => NULL hier anwendungsspezifisch.
Genau genommen ist ja ein ("Leerstring" != NULL). Nur möchte ich solche Felder in der DB nicht haben. Es sieht einfach schäusslich wenn man Felder hat bei denen ist NULL eingetragen bei anderen wiederum sind "Leerstrings" drin. Am Benutzer ein "Leerstring" anzuzeigen oder einen "Leerstring" auszuwerden ergibt für mich keinen Sinn. Entweder hat ein Feld für mich erkennbare Daten oder es ist LEER = NULL.

Sicherlich kann es für andere Anwendungen Sinn machen wenn man wissen will ob je ein Eintrag gemacht wurde oder nicht. Für meine Anwendung ist dies aber nicht relevant.
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.270 Beiträge
 
Delphi 10.4 Sydney
 
#22

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 12. Sep 2019, 18:19
Hallo,
Zitat:
bei denen ist NULL eingetragen bei anderen wiederum sind "Leerstrings" drin
Das liegt aber am Programmierer
Heiko
  Mit Zitat antworten Zitat
Benutzerbild von MyRealName
MyRealName

Registriert seit: 19. Okt 2003
Ort: Heilbronn
673 Beiträge
 
Delphi 10.4 Sydney
 
#23

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 13. Sep 2019, 07:11
Man kann das Feld in Firebird ja auch mit einem Default belegen, der dann ein Leerstring ist.
  Mit Zitat antworten Zitat
Benutzerbild von haentschman
haentschman
Online

Registriert seit: 24. Okt 2006
Ort: Seifhennersdorf / Sachsen
5.289 Beiträge
 
Delphi 12 Athens
 
#24

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 13. Sep 2019, 07:22
Moin...
Zitat:
Ich möchte keine Leerstrings in meiner DB
...so scheiden sich die Geister. Ich mag NULL Werte in der Datenbank nicht. Für mich ist ein Datensatz eine "Einheit" ... und da gibt es keine "Null = Wert nicht bekannt" Felder. Ein Feld hat einen Wert, und wenn es '' ist. Zum Anderen hat man auch die Kontrolle, ob der Datensatz auch komplett geschrieben wurde.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.851 Beiträge
 
Delphi 11 Alexandria
 
#25

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 13. Sep 2019, 07:47
Man kann das Feld in Firebird ja auch mit einem Default belegen, der dann ein Leerstring ist.
Das wäre dann geanu das Gegenteil von dem, was der TE will.

(Betreff des Threads ist etwas missverständlich)
Markus Kinzler
  Mit Zitat antworten Zitat
Int3g3r

Registriert seit: 28. Nov 2018
Ort: Schweiz
118 Beiträge
 
Delphi 10.3 Rio
 
#26

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 3. Okt 2019, 09:42
Ich versuche nun gerade auf der Datenbankseite dies zu realisieren.
Mir ist folgendes Beispiel zu umständlich, ich möchte nicht jedes Feld manuell im Trigger eintragen müssen:

SQL-Code:
SET TERM ^^ ;
CREATE TRIGGER <TABELLE>_BI FOR <TABELLE> ACTIVE BEFORE INSERT or UPDATE POSITION 0 AS
begin
  if ( new.<Feld> = '') then new.<Feld> = NULL;
end ^^
SET TERM ; ^^
Momentan habe ich im IBExpert einen "Parsing Error" den ich nicht weg bekomme.
Ich möchte das er automatisch die Felder der Tabelle holt und alle kontrolliert:

SQL-Code:
CREATE OR ALTER trigger "_TBTEST_BI0" for "_TBTEST"
active before insert position 0
AS
    declare variable field_name varchar(255);
begin
    for select rdb$field_name from rdb$relation_fields where rdb$relation_name=upper('_TBTEST') into :field_name
  do
  begin
    if (new.:field_name = '') then new.:field_name = NULL; --new.:field_name (Parsing error!)
  end
end
Gruss Int3g3r
  Mit Zitat antworten Zitat
Benutzerbild von dataspider
dataspider

Registriert seit: 9. Nov 2003
Ort: 04539 Groitzsch
1.350 Beiträge
 
Delphi 11 Alexandria
 
#27

AW: IBDAC: In der DB sind Leerstrings statt Null. Alternativen?

  Alt 4. Okt 2019, 08:02
Der Doppelpunkt ist nicht so universell einsetzbar wie sich das mancher wünscht.
Der ist halt für Parameter - nicht zum Basteln eines Statements.

Du kannst IMO nur eine SP (als Beispiel: sp_check_emty_strings) schreiben, welche als Parameter den Tabellenname und den PrimaryKey-Wert bekommt.
In des SP baust du das Statement als string und führst das Statement mit execute statement ... aus.

In der Tabelle benötigst du dann einen AFTER INSERT OR UPDATE Trigger.

Im Trigger steht dann nur noch: execute procedure sp_check_emty_strings('TABELLENNAME', new.id)

Frank
Frank Reim
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
3.072 Beiträge
 
Delphi 2010 Enterprise
 
#28

AW: IBDAC: In der DB sind Leerstrings statt Null. Alternativen?

  Alt 4. Okt 2019, 08:38
Also, ich weiß nicht, ob es eine gute Idee ist, einen solchen generalisierten Trigger so einzusetzen.

Dynamisch alle Felder auf Null abzuklappern bedeutet in der Praxis:
- ignorieren von Key field Definitionen?
- schlechtere Performance
- Intransparenz

Die Verwendung optionaler Fremdschlüssel oder auch die Verwendung von PK und nicht optionalen FK erfolgt auf Basis allgemein verwendeter und notwendiger Vorgehen bei Modelierung und Datenverarbeitnug. NULL/ Not NULL ist fester Bestandteil im Umgabng mit Schlüsselfeldern und Fremdschlüsseln. Das sollte man nicht überformen.
Jedes Insert oder Update muss die Felder aus dem Dictionary auslesen, darüber loopen und mit den Eingangsdaten abgleichen. Das kostet Zeit.
Insertanweisungen werden intransparent "verbogen". Das ist mit Triggern leider immer so und man sieht es einem Tabellenfeld nicht an.

Wenn man sowas trotzdem machen möchte, wäre es vielleicht sinnvoller, statische Trigger herzunehmen, deren Code man meinetwegen anhand des Models generiert. Hier würde man gezielt alle Keyfields ausnehmen und auch alle Zahlenfelder, sowie alle not null Felder.
Außerdem könnte man Constraints einsetzen, die Leerstrings als Inhalt verbieten.
Gruß, Jo
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
563 Beiträge
 
Delphi XE6 Enterprise
 
#29

AW: IBDAC Leerstring statt Null. Alternativen?

  Alt 7. Okt 2019, 11:25
Moin...
Zitat:
Ich möchte keine Leerstrings in meiner DB
...so scheiden sich die Geister. Ich mag NULL Werte in der Datenbank nicht. Für mich ist ein Datensatz eine "Einheit" ... und da gibt es keine "Null = Wert nicht bekannt" Felder. Ein Feld hat einen Wert, und wenn es '' ist. Zum Anderen hat man auch die Kontrolle, ob der Datensatz auch komplett geschrieben wurde.
Trotzdem muss man immer mit NULL rechnen. Jeder JOIN der kein INNER ist, kann NULL-Werte produzieren. Beispielsweise als Ergebnis eines Views oder einer Selectable Stored Procedure, das im Programm dann wie ein "Datensatz" aussieht - mit NULL-Werten drin.

Btw. Für
Code:
IF (feld = '') feld = NULL;
gibt es eine eigene Anweisung
Code:
feld = NULLIF(feld, '');
Ist quasi das Gegenstück zu COALESCE.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 3 von 3     123   


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:22 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