![]() |
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:
Was muss man machen, damit es funktioniert?
var AFeld : String;
AFeld := myADO['Feld']); // Fehler, falls Inhalt von 'Feld' = NULL AFeld := String(myADO['Feld'])); // produziert den gleichen Fehler |
Re: NULL-Werte auf String casten?
Schau dir mal
Delphi-Quellcode:
an.
TADOQuery.FieldByName('spaltenname').AsString
|
Re: NULL-Werte auf String casten?
Geht leider auch nicht...
Delphi-Quellcode:
verzweifelt...
AFeld := myADO['Feld'].AsString; // gleicher Fehler falls NULL
if myADO['Feld'].IsNull then AFeld := '' else AFeld := myADO['Feld']; // Fehler: "Variante referenziert kein Automatisierungsobjekt" ??? |
Re: NULL-Werte auf String casten?
Hast du gelesen, was ich geschrieben habe?
Delphi-Quellcode:
var AFeld : string;
begin AFeld := myADO.FieldByName('Feld').AsString; : |
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')? |
Re: NULL-Werte auf String casten?
MyADO["FeldName"] liefert den Feldinhalt als Variant, wohingegen MyADO.FieldByName("FeldName") eine Instanz vom Typ TField liefert.
|
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? |
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... |
Re: NULL-Werte auf String casten?
Zitat:
![]() |
Re: NULL-Werte auf String casten?
Zitat:
Cheers, |
Re: NULL-Werte auf String casten?
Zitat:
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: |
Re: NULL-Werte auf String casten?
Grundsätzlich macht der wert NULL aber schon Sinn.
|
Re: NULL-Werte auf String casten?
Zitat:
Zitat:
|
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. |
Re: NULL-Werte auf String casten?
Zitat:
|
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? |
Re: NULL-Werte auf String casten?
Du hast aber bemerkt, von wem der Advantage Database Server stammt, oder? ;)
|
Re: NULL-Werte auf String casten?
Oder genauer, wer dieses Produkt aufgekauft hat.
|
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.
|
Re: NULL-Werte auf String casten?
Zitat:
Zitat:
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. |
Re: NULL-Werte auf String casten?
Zitat:
gibt es da irgendwo ein Delphi-Beispiel? in google hab' ich nur die üblichen Verweise auf TADO... gefunden und ![]() Gruß K-H |
Re: NULL-Werte auf String casten?
Zitat:
|
Re: NULL-Werte auf String casten?
Zitat:
![]() Zitat:
|
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. |
AW: NULL-Werte auf String casten?
Gibt es kein
Delphi-Quellcode:
?
ADOQuery1['Suchwert'].IsNull
Verwendbar zB in einem if:
Delphi-Quellcode:
Sherlock
if not ADOQuery1['Suchwert'].IsNull then
such := ADOQuery1['Suchwert']; |
AW: NULL-Werte auf String casten?
Eventuell sowas:
Delphi-Quellcode:
VAR
such: VARIANT; .. .. if not VarIsEmpty(ADOQuery1['Suchwert']) then such := ADOQuery1['Suchwert']; |
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:
wird NULL zu einem Leerstring was aber nicht heißt, daß ein LeerString=NULL ist.
.Asstring
Gruß K-H |
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