Um jetzt mal auf den Ursprungsthread zu antworten
Jetzt meine eigentlichen Fragen:
- Wie gehe ich das am cleversten an? Ich meine, 100% dafür Sorge tragen dass alle Datensätze niemals irgendwo NULL in sich tragen kanns nich sein.
Nee, ist auch doof, vor allem weil es eine Weitere Information beinhaltet -> Es liegen
keine Daten vor
Ist das absolut unerwünscht, dann eben NULL-Werte in der Tabelle verbieten
- Muss ich für jedes verwendete Feld im Select schon das erwähnte ISNULL(NAME,'') verwenden??? Sieht ja irgendwie nicht so dolle aus: SELECT IFNULL(ADR_NAME1,''''), IFNULL(ADR_NAME2,''''), ISNULL(ADR_STRASSE,'''')... Schreib das mal bei 30-50 Feldern
Nö
- ist das der "only way", muss ich mir da eine func schreiben die aus einem gegebenen Feldnamen das IFNULL(F_N,'''') bastelt und an's stringQUERY dranhängt???
Nö
- Oder gibts einen smooth-and-easy-Trick für meine Problemstellung?
Ja
- ist meine try-except-finally Idee möglicherweise doch nicht so blöde?
ähhm, die geht schon mal gar nicht ... Except (übers. Ausnahme) und sollte auch nur für Ausnahmen verwendet werden und nicht für den Regelbetrieb.
Aus den hier schon genannten Lizenzgründen würde ich an deiner Stelle Zugriffs-Komponenten verwenden, die ohne die
libmysql.dll auskommen.
Weiterhin würde ich für die
Darstellung der Werte eine generalisierte procedures schreiben ala
Delphi-Quellcode:
function FieldToStr( Field : TField ) : string;
begin
if Assigned( Field ) then
begin
if VarIsNull( Field.Value ) then
Result := '' // auch möglich Result := '(null)'
else
case Field.FieldType of
ftInteger : Result :=
end;
end
else
Result := '';
end;
procedure DataSetShowInListView( DataSet : TDataSet; ListView : TListView; FieldList : array of string );
var
idx : integer;
valstr : string;
begin
for idx := Low( FieldList ) to High( FieldList ) do
begin
valstr := FieldToStr( DataSet.FindField( FieldList[ idx ] ) );
...
end;
end;
Ich würde aber in den meisten Fällen ein DBGrid (gut persönlich benutze ich ein cxGrid
) für die Anzeige bemühen, denn da braucht es dieses Geraffel nicht.
Weiterhin kann man sich auch Objekte anlegen, wo diese Daten enthalten sind und dann an die Liste übergeben (ORM).
Das Objekt selber kümmert sich dann um die richtige Umwandlung der Daten
Delphi-Quellcode:
type
TAdresse = class
private
FVorname : Variant;
function GetVorname : string;
procedure SetVorname( const Value : string );
procedure SetRawVorname( const Value : Variant );
public
property Vorname : string read GetVorname write SetVorname;
property RawVorname : Variant read FVorname write SetRawVorname;
end;
function TAdresse.GetVorname : string;
begin
Result := VarToStrDef( FVorname, '' );
end;
procedure TAdresse.SetVorname( const Value : string );
begin
FVorname := Value;
end;
procedure TAdresse.SetRawVorname( const Value : Variant );
begin
FVorname := Value;
end;