Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Absolute Database: NULL und String (https://www.delphipraxis.net/77628-absolute-database-null-und-string.html)

MCXSC 22. Sep 2006 01:49

Datenbank: Absolute Database • Version: 5.05 • Zugriff über: SQL

Absolute Database: NULL und String
 
Hallo!

Ich habe folgendes Problem:

Ich verwende die Absolute Database und greife darauf nur mit ABSQuery-Kompo zu (also ohne einen DataSource, nur über die "SQL"-Funktion der Kompo).

Ich erstelle nun eine Datenbank, in der alle Felder den Default NULL haben:

Delphi-Quellcode:
sql.add(' feld1 VARCHAR(255) default NULL,');
Nun trage ich mit Hilfe folgender Codezeile einen Wert in diesem Feld ein:

Delphi-Quellcode:
if trim(edit_feld1.text) = '' then sql.add(' NULL, ')
else sql.add(' '''+trim(edit_feld1.text)+''', ');
Die beiden Ausschnitte sind nur Teilzeilen, denn das Funktioniert ohne Probleme.

Nun beginne ich, dieses Feld auszulesen und in einem Edit-Feld zu speichern:

Delphi-Quellcode:
edit_feld1_neu.text := FieldValues['feld1'];
Das funktioniert auch ganz gut... Aber eben nur solange der Wert nicht NULL ist. Ist der Wert NULL, so bekomme ich folgende Fehlermeldung:

"Variante des Typs (Null) konnte nicht in Typ (String) konvertiert werden."

Ich verzweifel da grad echt dran... Gibt es da nicht eine Möglichkeit, den Wert erst zu prüfen und falls der Wert eben NULL ist einen Leerstring ('') an Delphi zu übergeben?

Danke im vorraus,
MCXSC

gmc616 22. Sep 2006 03:31

Re: Absolute Database: NULL und String
 
Moin,
Absolute Database und ihre Kompos kenne ich leider nicht.
Mit ZEOS z.B., kannst du die Fields mit FieldByName('feld1').IsNull auf NULL prüfen. Evtl. bietet ABS dies auch.

Oder du stellst die SqlQuery anders:
SQL-Code:
SELECT feld1|'' FROM tabelle;
Hab ich nicht probiert, sollte aber funktionieren.

Generell würde ich aber die Default-Werte der Tabellenfelder nicht auf NULL sondern auf '' setzen.
Delphi-Quellcode:
sql.add(' feld1 VARCHAR(255) default '''',');
Dann hätte sich das Problem von vornherein erledigt.

Ich hoffe, es hilft. :hi:

MCXSC 22. Sep 2006 04:02

Re: Absolute Database: NULL und String
 
So, hab es mal durchgetestet...

Mit Hilfe von

Delphi-Quellcode:
if FieldByName('feld1').IsNull then
klappt es. Danke dafür! :thumb:


***---***


Allerdings habe ich das Gefühl, dass (zumindest für Absolute Database)

Delphi-Quellcode:
sql.add(' feld1 VARCHAR(255) default NULL,')
und

Delphi-Quellcode:
sql.add(' feld1 VARCHAR(255) default '''',');
das Gleiche sei...? Jedenfalls kommen da bei beiden Möglichkeiten die gleichen Fehler... :gruebel:


***---***


Sorry, aber was bewirkt

Delphi-Quellcode:
SELECT feld1|'' FROM tabelle;
Wenn ich das so schreibe, bekomme ich die Fehlermeldung "Unterminated String at..."

marabu 22. Sep 2006 06:35

Re: Absolute Database: NULL und String
 
Hallo Marcel,

SQL und NULL-Werte - darüber sind schon ganze Bücher geschrieben worden. Dein konkretes Problem kannst du auch so lösen:

Delphi-Quellcode:
uses
  Variants;

begin
  // ...
  edit_feld1_neu.Text := VarToStr(FieldValues['feld1']);
  // ...
end;
Grüße vom marabu

MCXSC 22. Sep 2006 20:20

Re: Absolute Database: NULL und String
 
Ja ich weiß... Aber da steht für mich teilweise zu viel drin. Ich kann in mySQL nur das nötigste und nur das was ich brauche :)

Aber die Funktion VarToStr() funktioniert! Danke... Damit spar ich dann doch nochma ein wenig Code!

raiguen 23. Sep 2006 00:30

Re: Absolute Database: NULL und String
 
Moin :-)

In AbsoluteDatabase gibt eine schöne Möglichkeit, schon im SQL-Statement ein Feld auf NULL abzufragen und ggf mit einem bestimmten Wert vorzubelegen und somit im Ergbenis dann gleich fertige Werte zu erhalten, die nicht im anschließenden COde 'umformatiert' werden müssen:
Code:
SELECT
   CASE WHEN feld1 IS NULL THEN 'irgendeinwert' ELSE feld1 END feld1,
   COALESCE(feld2,'wert wenn feldinhalt NULL),
   feld3...
FROM test
Interessant ist hier die Zeile CASE WHEN...: dies prüft, ob das feld1 NULL ist (oder auch '') und belegt es in diesem Beispiel mit dem String irgendeinwert -das kann aber ein ein Leesrtring sein; ist das feld1 nicht leer, dann nimm den Feldinhalt von feld1 und gebe ihn aus.
Das ganze funktioniert natürlich auch mit Integer- oder Floatfeldern ;-)

Die zweite Anweisung COALESCE überprüft auch das feld2 auf NULL und gibt dann enstprechend den angebenen Wert wert wenn feldinhalt NULL aus (auch nur als exemplarischer Wert), ansonsten halt eben den Inhalt des feld2, wenn dieses nicht NULL ist...
Das mal so als Tipp...

MCXSC 23. Sep 2006 03:41

Re: Absolute Database: NULL und String
 
@raiguen:

Danke für den Hinweis. Aber ich habe mich doch für die VarToStr()-Methode entschieden da ich die Werte aus der DB an eine Funktion weitergebe und ich dadurch eben sehr viel Code spare... Aber gebrauchen kann man es sicherlich nochmals ;)

marabu 23. Sep 2006 11:19

Re: Absolute Database: NULL und String
 
Hallo Leute,

die Entscheidung, ob ein NULL-Wert bereits auf dem Server oder erst beim Client behandelt wird, ist nicht über das Knie zu brechen. Ich hatte es bereits erwähnt - NULL-Werte in relationalen Datenbanken sind kein leichtes Thema und werden oft falsch verstanden oder benutzt. Einige NULL-Werte kann ich bereits über DDL default constraints eliminieren - dazu gehören in der Regel diejenigen, die ich später umständlich über CASE oder COALESCE behandle. Durch foreign key contraints schlagen NULL-Werte dann doch irgendwann bis zum Client durch. Es gibt kein Universalrezept, Nachdenken ist notwendig.

Freundliche Grüße vom marabu


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:21 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-2025 by Thomas Breitkreuz