Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi NULL-Werte auf String casten? (https://www.delphipraxis.net/137647-null-werte-auf-string-casten.html)

Frederika 25. Jul 2009 13:05

Datenbank: MS Access • Zugriff über: ADO

NULL-Werte auf String casten?
 
Ich lese Daten mittels TADOQuery aus eine Datenbank (derzeit testweise Access, aber eigentlich unabhängig davon). Manche der Felder sind leider leer (NULL). Ich möchte beim Einlesen dieser Felder einen Leerstring erzeugen, erhalte aber immer einen Cast-Error ("Ungültige Variant-Typumwandlung").

Delphi-Quellcode:
var AFeld : String;
AFeld := myADO['Feld']); // Fehler, falls Inhalt von 'Feld' = NULL
AFeld := String(myADO['Feld'])); // produziert den gleichen Fehler
Was muss man machen, damit es funktioniert?

omata 25. Jul 2009 13:15

Re: NULL-Werte auf String casten?
 
Schau dir mal
Delphi-Quellcode:
TADOQuery.FieldByName('spaltenname').AsString
an.

Frederika 25. Jul 2009 13:23

Re: NULL-Werte auf String casten?
 
Geht leider auch nicht...

Delphi-Quellcode:
AFeld := myADO['Feld'].AsString; // gleicher Fehler falls NULL
if myADO['Feld'].IsNull then AFeld := '' else AFeld := myADO['Feld']; // Fehler: "Variante referenziert kein Automatisierungsobjekt" ???
verzweifelt...

omata 25. Jul 2009 13:25

Re: NULL-Werte auf String casten?
 
Hast du gelesen, was ich geschrieben habe?

Delphi-Quellcode:
var AFeld : string;
begin
  AFeld := myADO.FieldByName('Feld').AsString;
  :

Frederika 25. Jul 2009 13:53

Re: NULL-Werte auf String casten?
 
Hallo Omata! Vielen Dank, hat tatsächlich geklappt. Super! Sorry, ich war auf das AsString fixiert, das bei myADO['Feld'] nicht funktioniert.

Worin unterscheiden sich denn die Zugriffe myADO['Feld'] und FieldByName('Feld')?

alzaimar 25. Jul 2009 15:41

Re: NULL-Werte auf String casten?
 
MyADO["FeldName"] liefert den Feldinhalt als Variant, wohingegen MyADO.FieldByName("FeldName") eine Instanz vom Typ TField liefert.

Frederika 25. Jul 2009 16:23

Re: NULL-Werte auf String casten?
 
Vielen Dank für die Erklärung.

Gibt es Performanz-Empfehlungen für die eine oder andere Art? Oder ist der Zugriff gleich schnell?

haentschman 25. Jul 2009 16:53

Re: NULL-Werte auf String casten?
 
Hallo,

unabhängig von der Lösung noch mein Senf dazu. :P
Ich persönlich mag keine NULL Werte in der Datenbank. Ich schreibe in sämtliche Felder beim neuen Datensatz zumindest Standardwerte. Wenn dann ein Feld NULL sein sollte, ist was schiefgelaufen :wink:

bis dann...

Bernhard Geyer 25. Jul 2009 17:07

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von Frederika
Gibt es Performanz-Empfehlungen für die eine oder andere Art? Oder ist der Zugriff gleich schnell?

Wenn du performance benötigst, schau dir mal die Kompos von DevArt an. Fall's du das letzte Prozent an Performance benötigst und auf TDataset-Kompatiblität verzichten kannst greif direkt auf die ADO-Schnittstelle zu und vergiss die Wrapper wie bei ADOExpress/dbGo.

mjustin 25. Jul 2009 18:37

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von haentschman
Hallo,

unabhängig von der Lösung noch mein Senf dazu. :P
Ich persönlich mag keine NULL Werte in der Datenbank. Ich schreibe in sämtliche Felder beim neuen Datensatz zumindest Standardwerte. Wenn dann ein Feld NULL sein sollte, ist was schiefgelaufen :wink:

bis dann...

Mit welchem Wert initialisierst Du das Feld 'Geschlecht', falls es unbekannt ist - mit 'männlich' oder 'weiblich'? ;)

Cheers,

haentschman 25. Jul 2009 19:45

Re: NULL-Werte auf String casten?
 
Zitat:

Mit welchem Wert initialisierst Du das Feld 'Geschlecht', falls es unbekannt ist - mit 'männlich' oder 'weiblich'?
:thumb: der ist gut.

mit Standardwerten meine ich "Standard" für den Feldtyp. Integer mit 0, String / Blob mit '' etc... Hauptsache nicht NULL.

PS: und wenn das Geschlecht '' ist, ist es entweder noch nicht zugeordnet...oder was anderes :gruebel: :wink:

mkinzler 25. Jul 2009 20:20

Re: NULL-Werte auf String casten?
 
Grundsätzlich macht der wert NULL aber schon Sinn.

omata 26. Jul 2009 00:28

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von haentschman
Ich persönlich mag keine NULL Werte in der Datenbank.

autsch! :wall:

Zitat:

Zitat von mkinzler
Grundsätzlich macht der wert NULL aber schon Sinn.

danke :thumb:

Frederika 29. Jul 2009 15:54

Re: NULL-Werte auf String casten?
 
Nochmal vielen Dank für Eure Antworten, vor allem Omata für die schnelle Lösung zu meiner Frage.

@Bernhard Geyer: Danke für den Link zu DevArt. Leider haben die nichts für Sybase.

worker 29. Jul 2009 16:05

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von Frederika
Leider haben die nichts für Sybase.

Ähm, Sybase bietet doch eigene Komponenten für den Zugriff an. Such mal nach adac oder Advantage DataAccessComponents.

Frederika 29. Jul 2009 19:05

Re: NULL-Werte auf String casten?
 
@worker: Davon verstehe ich irgendwie gar nichts. Ich programmiere wissenschaftlich, aber habe von Datenbanken leider nur SEHR begrenzte Ahnung (muss halt nur zum Austausch der Daten leider gemacht werden / riesige Molekulardaten). Unser Koop-Partner hat Sybase 9 -- was soll ich da mit dem Advantage Server? Ich bräuchte eher eine einfache Komponente, mit der ich direkt auf das vorhandene Sybase 9 zugreifen kann. Ich denke nicht, dass ich beim Koop-Partner mehr als mein Programm laufen lassen kann.

Derzeit nutze ich ADOQuery und ADOCommand, beides ohne visuelle Komponenten, es geht nur um das Wegschreiben eigener, komplexer Datenstrukturen (also daraus ausgewählten Ergebnissen) als schlichte Datenbanktabellen. Ein ebenso einfach zu verwendender, aber performanterer Ersatz für die beiden ADO-Komponenten wäre toll. Gibt es so was?

DeddyH 29. Jul 2009 19:12

Re: NULL-Werte auf String casten?
 
Du hast aber bemerkt, von wem der Advantage Database Server stammt, oder? ;)

mkinzler 29. Jul 2009 19:15

Re: NULL-Werte auf String casten?
 
Oder genauer, wer dieses Produkt aufgekauft hat.

Frederika 29. Jul 2009 22:27

Re: NULL-Werte auf String casten?
 
@DedyH: Klar habe ich das gesehen -- es mags ein, dass ich den Zusammenhang einfach nicht begreife, aber wenn ich von Delphi möglichst perfomant und simpel auf Sybase 9 zugreifen muss, was nützt dann der zusätzliche Advantage Server? Ersetzt der nicht eher Sybase? Oder was soll das ganze? Sorry, ich stecke in Datanbanken wirklich nicht drin und ADOQuery und ADOCommand sind sehr leicht zu bedienen und compilieren in den Code -- das gleiche in performanter wäre gut, aber ich kann auf Seiten des Partners nichts ändern.

mkinzler 30. Jul 2009 06:35

Re: NULL-Werte auf String casten?
 
Zitat:

was nützt dann der zusätzliche Advantage Server?
Nichts.
Zitat:

Ersetzt der nicht eher Sybase?
Sybase hat ihr Angebot durch ADS erweitert aber es ist eigentlich kein Ersatz.
ADO bietet sich eigentlich nur für Access und MSSQL an, für andere DBMS gibt es meist bessere Komponenten. Aber wenn die Auswahl nicht in deiner Hand liegt ist es müssig darüber zu diskutieren.

p80286 30. Jul 2009 11:04

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von Bernhard Geyer
Fall's du das letzte Prozent an Performance benötigst und auf TDataset-Kompatiblität verzichten kannst greif direkt auf die ADO-Schnittstelle zu und vergiss die Wrapper wie bei ADOExpress/dbGo.

Hallo Bernhard,

gibt es da irgendwo ein Delphi-Beispiel?
in google hab' ich nur die üblichen Verweise auf TADO... gefunden und Microsoft ist für Delphianer nicht ganz so ergiebig.

Gruß
K-H

Frederika 30. Jul 2009 19:09

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von mkinzler
ADO bietet sich eigentlich nur für Access und MSSQL an, für andere DBMS gibt es meist bessere Komponenten. Aber wenn die Auswahl nicht in deiner Hand liegt ist es müssig darüber zu diskutieren.

Na ja, Komponenten für mein Programm kann ich mir natürlich frei aussuchen, aber laufen muss das ganze dann mit Sybase auf einem fremden System ohne zusätzliche Installationen. Die Performanz ist derzeit ausreichend, aber wenn es empfehlenswerte Komponenten für direkten Zugriff auf Sybase 9 gibt, dann schaue ich mir sie gerne mal an. Vorschläge sind willkommen. Ich bräuchte nur Ersatz für TADQuery und TADOCommand -- mit den letzten Tipps hier aus dem Forum ist die Performanz jetzt aber ziemlich OK.

Bernhard Geyer 30. Jul 2009 19:15

Re: NULL-Werte auf String casten?
 
Zitat:

Zitat von p80286
gibt es da irgendwo ein Delphi-Beispiel?

Suche mal im http://www.entwickler-forum.de nach "CoConnection Kosch"

Zitat:

Zitat von Frederika
Na ja, Komponenten für mein Programm kann ich mir natürlich frei aussuchen, aber laufen muss das ganze dann mit Sybase auf einem fremden System ohne zusätzliche Installationen.

Dann geht es zu 100% nicht mit ADO da dieser standardmäßig keinen OLE DB Provider für Sybase mitbringt.

FediDelPr 19. Dez 2018 15:01

AW: NULL-Werte auf String casten?
 
Gemässe Alzaimar liefert MyADO["FeldName"] den Feldinhalt als Variant (siehe oben).

Warum gelingt mir dann die Zuweisung

VAR
such: VARIANT;
..
..

such := ADOQuery1['Suchwert'];

nicht.

Ist der Feldinhalt NULL, kommt die übliche Fehlermeldung:

Could not convert variant of type (Null) into type (OleStr)


Zurzeit arbeite ich mit FieldByName würde NULL aber gerne
explizit abfangen.

Tools: ACCESS recht neu, DELPHI Berlin

Danke für eine Begründung.

Sherlock 19. Dez 2018 15:05

AW: NULL-Werte auf String casten?
 
Gibt es kein
Delphi-Quellcode:
ADOQuery1['Suchwert'].IsNull
?

Verwendbar zB in einem if:
Delphi-Quellcode:
if not ADOQuery1['Suchwert'].IsNull then
  such := ADOQuery1['Suchwert'];
Sherlock

Delphi.Narium 19. Dez 2018 15:13

AW: NULL-Werte auf String casten?
 
Eventuell sowas:
Delphi-Quellcode:
VAR
such: VARIANT;
..
..
if not VarIsEmpty(ADOQuery1['Suchwert']) then such := ADOQuery1['Suchwert'];

p80286 19. Dez 2018 15:16

AW: NULL-Werte auf String casten?
 
@Sherlock
Soweit ich weiß, Nein!

NULL bedeutet ja, daß ein Feld leer ist. Das wiederum sollte in der Query abgefangen werden, falls notwendig. NULL ist eine Information, die nur in der DB existiert.
Mit dem
Delphi-Quellcode:
.Asstring
wird NULL zu einem Leerstring was aber nicht heißt, daß ein LeerString=NULL ist.

Gruß
K-H

FediDelPr 19. Dez 2018 17:35

AW: NULL-Werte auf String casten?
 
Danke für die schnellen Rückmeldungen.


Zusammengefasst komme ich nun zu folgenden Erkenntnissen:

VAR
such: STRING;

..
..

IF VarIsClear(ADOQueryAuto['Suchbegriff'])
THEN ShowMessage('not assigned')
ELSE ShowMessage('assigned');

IF VarIsEmpty(ADOQueryAuto['Suchbegriff'])
THEN ShowMessage('NULL')
ELSE ShowMessage('not NULL');

(* zwar einfach .. *)
such := ADOQueryAuto.FieldByName('Suchbegriff').AsString;

(* .. oder aus meiner Sicht besser *)
IF VarIsEmpty(ADOQueryAuto['Suchbegriff'])
THEN such := ADOQueryAuto['Suchbegriff']
ELSE such := '' (* .. oder etwas anderes *);

Es gibt keine Fehlermeldungen mehr und ich denke es läuft (ohne genaue Checks).

Etwas allerdings bleibt unbeantwortet. Warum wird die Zuweisung

vari := ADOQueryAuto['Suchbegriff'];

an den Typ VARIANT nicht akzeptiert ?
Ist der Term ADOQueryAuto['Suchbegriff'] evtl. gar nicht vom Typ VARIANT ?


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:05 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