![]() |
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:
Nun trage ich mit Hilfe folgender Codezeile einen Wert in diesem Feld ein:
sql.add(' feld1 VARCHAR(255) default NULL,');
Delphi-Quellcode:
Die beiden Ausschnitte sind nur Teilzeilen, denn das Funktioniert ohne Probleme.
if trim(edit_feld1.text) = '' then sql.add(' NULL, ')
else sql.add(' '''+trim(edit_feld1.text)+''', '); Nun beginne ich, dieses Feld auszulesen und in einem Edit-Feld zu speichern:
Delphi-Quellcode:
Das funktioniert auch ganz gut... Aber eben nur solange der Wert nicht NULL ist. Ist der Wert NULL, so bekomme ich folgende Fehlermeldung:
edit_feld1_neu.text := FieldValues['feld1'];
"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 |
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:
Hab ich nicht probiert, sollte aber funktionieren.
SELECT feld1|'' FROM tabelle;
Generell würde ich aber die Default-Werte der Tabellenfelder nicht auf NULL sondern auf '' setzen.
Delphi-Quellcode:
Dann hätte sich das Problem von vornherein erledigt.
sql.add(' feld1 VARCHAR(255) default '''',');
Ich hoffe, es hilft. :hi: |
Re: Absolute Database: NULL und String
So, hab es mal durchgetestet...
Mit Hilfe von
Delphi-Quellcode:
klappt es. Danke dafür! :thumb:
if FieldByName('feld1').IsNull then
***---*** Allerdings habe ich das Gefühl, dass (zumindest für Absolute Database)
Delphi-Quellcode:
und
sql.add(' feld1 VARCHAR(255) default NULL,')
Delphi-Quellcode:
das Gleiche sei...? Jedenfalls kommen da bei beiden Möglichkeiten die gleichen Fehler... :gruebel:
sql.add(' feld1 VARCHAR(255) default '''',');
***---*** Sorry, aber was bewirkt
Delphi-Quellcode:
Wenn ich das so schreibe, bekomme ich die Fehlermeldung "Unterminated String at..."
SELECT feld1|'' FROM tabelle;
|
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:
Grüße vom marabu
uses
Variants; begin // ... edit_feld1_neu.Text := VarToStr(FieldValues['feld1']); // ... end; |
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! |
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:
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.
SELECT
CASE WHEN feld1 IS NULL THEN 'irgendeinwert' ELSE feld1 END feld1, COALESCE(feld2,'wert wenn feldinhalt NULL), feld3... FROM test 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... |
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 ;) |
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