![]() |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
Delphi-Quellcode:
Database.DriverID := 'MSAcc';
|
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
ist es sinnvoll die Änderung so
Delphi-Quellcode:
Ist .IsEmpty = True, auch wenn Recordcount gleich 0 oder das Feld nicht vorhanden ist? Wenn das Feld nicht vorhanden ist, sollte doch eine Exception ausgelöst werden.
if (FieldByName(aFeld).asString.IsEmpty) or (FieldByName(aFeld).IsNull) or
(Recordcount = 0) then oder so if FieldByName(aFeld).asString.IsEmpty then Danke für deine Antwort. Gruß Michael |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
warum geht das so nicht? Ich habe versucht mich in der Lektüre von Carry Jensen - Delphi in Depth: FireDAC zu diesem Thema einzulesen. Ich habe grundsätzlich verstanden, dass mit &MACRO eine Ersetzung im SQL-Statement stattfinden kann, die aber doch auch mit : PARAM (so wie in deinem ersten Beispiel) erfolgen kann. Ich verstehe den Unterschied zwischen den Ersetzungsbegriffen aTabelle und aFeld nicht, da es sich in beiden Fällen um Stringwerte handelt. Danke für deine Antwort. Gruß Michael |
AW: Fehlermeldung beim Zugriff auf die Datenbank
[QUOTE=himitsu;1501211]
Zitat:
Gruß Michael |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Hallo Forum,
dank eurer vielen Kommentare und Anregungen habe ich den Code nun folgendermaßen angepasst:
Delphi-Quellcode:
Die ursprüngliche Fehlermeldung aus #1 bleibt aber weiterhin bestehen. Wie gesagt, die Fehlermeldung kommt nur in Verbindung mit einer Microsoft Access Datenbank und auch nur einmal beim ersten Druchlauf.
function GetFeldwertFromID(aTabelle, aFeld: string; aID: integer): Variant;
var MyQuery: TFDQuery; begin Result := StrKeinEintrag; MyQuery := TFDQuery.Create(MyDB); try MyQuery.Connection := MyDB; if (MyQuery.Connection.Connected) and (aID > 0) then begin with MyQuery do begin SQL.Text := 'select * from &pTabelle where ID = :pID'; MacroByName('pTabelle').asRaw := aTabelle; ParamByName('pId').asInteger := aId; try open; if not (FieldByName(aFeld).IsNull) and not (FieldByName(aFeld).asString.IsEmpty) and (Recordcount > 0) and ((FindField('GELOESCHT') = nil) or (Locate('GELOESCHT', 0, []))) then Result := FieldByName(aFeld).AsString; except raise; end; end; end; finally MyQuery.Close; MyQuery.Free; end; end; Was mich übrigens noch interessieren würde ist: Zitat:
Gruß Michael |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
![]() |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
![]() |
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
|
AW: Fehlermeldung beim Zugriff auf die Datenbank
Persönlich würd' ich diesen Teil umbauen:
Delphi-Quellcode:
In etwa so (das with lassen wir jetzt mal wie es ist, auch wenn ich es überhauptnicht mag ;-)):
if not (FieldByName(aFeld).IsNull) and
not (FieldByName(aFeld).asString.IsEmpty) and (Recordcount > 0) and ((FindField('GELOESCHT') = nil) or (Locate('GELOESCHT', 0, []))) then Result := FieldByName(aFeld).AsString;
Delphi-Quellcode:
Ist RecordCount = 0, muss nicht geprüft werden, ob es die Felder überhaupt gibt, spart die Suche der Felder und wenn die mal nil sein sollten, kracht es nicht, weil die erste Bedingung nicht erfüllt ist und damit die restlichen Prüfungen obsolet werden.
if (Recordcount > 0) and
not (FieldByName(aFeld).IsNull) and not (FieldByName(aFeld).asString.IsEmpty) and ((FindField('GELOESCHT') = nil) or (Locate('GELOESCHT', 0, []))) then Result := FieldByName(aFeld).AsString; Das ändert sich erst dann, wenn man in den Kompileroptionen das "Boolsche Asudrücke vollständig auswerten" aktiviert hat. Alternativ könntest Du vor
Delphi-Quellcode:
auch noch prüfen, ob
not (FieldByName(aFeld).IsNull)
Delphi-Quellcode:
, derweil: Das könnte (theoretisch) auch noch schief gehen.
and not (FindField(aFeld) = nil)
|
AW: Fehlermeldung beim Zugriff auf die Datenbank
Zitat:
P.S.: als Zeichen meiner Läuterung; hier der akutelle Code - ohne with - :roll:
Delphi-Quellcode:
function GetFeldwertFromID(aTabelle, aFeld: string; aID: integer): Variant;
var MyQuery: TFDQuery; begin Result := StrKeinEintrag; MyQuery := TFDQuery.Create(MyDB); try MyQuery.Connection := MyDB; if (MyQuery.Connection.Connected) and (aID > 0) then begin MyQuery.SQL.Text := 'select * from &pTabelle where ID = :pID'; MyQuery.MacroByName('pTabelle').asRaw := aTabelle; MyQuery.ParamByName('pId').asInteger := aId; try MyQuery.open; if (MyQuery.Recordcount > 0) and not (MyQuery.FieldByName(aFeld).IsNull) and not (MyQuery.FieldByName(aFeld).asString.IsEmpty) and ((MyQuery.FindField('GELOESCHT') = nil) or (MyQuery.Locate('GELOESCHT', 0, []))) then Result := MyQuery.FieldByName(aFeld).AsString; except raise; end; end; finally MyQuery.Close; MyQuery.Free; end; end; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 01:49 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