AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Delphi Fehlermeldung beim Zugriff auf die Datenbank
Thema durchsuchen
Ansicht
Themen-Optionen

Fehlermeldung beim Zugriff auf die Datenbank

Offene Frage von "Humbucker"
Ein Thema von Humbucker · begonnen am 25. Jan 2022 · letzter Beitrag vom 22. Mär 2022
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    
Humbucker

Registriert seit: 8. Feb 2013
Ort: im Lahntal
35 Beiträge
 
Delphi 10.4 Sydney
 
#1

Fehlermeldung beim Zugriff auf die Datenbank

  Alt 25. Jan 2022, 17:14
Datenbank: Microsoft Access • Version: 2012 • Zugriff über: FireDAC
Hallo zusammen,

seit der Umstellung unserer Anwendung auf FireDAC gibt es eine Fehlermeldung, welche nur in Verbindung mit einer Microsoft Access Datenbank auftaucht. Wird die Anwendung in Verbindung mit Microsoft SQLServer gestartet, tritt die Fehlermeldung nicht auf. Die betreffende Funktion wird vielfach durchlaufen und bringt die Fehlermeldung ausschließlich beim ersten Durchlauf. Zuvor wurden im Programmablauf bereits einige Daten ohne Probleme aus der Datenbank gelesen.

Die Fehlermeldung löst keine Exception aus und der Code wird mit dem nächsten Befehl fortgesetzt.

Fehlermeldung: "Abfrageunterstützung nicht verfügbar"

Delphi-Quellcode:
function GetFeldwertFromID(aTabelle, aFeld: string; aID: integer): Variant;
var
  MyQuery: TFDQuery;
begin
  if aID = 0 then
    exit;
  MyQuery := TFDQuery.Create(MyDB);
  MyQuery.Connection := MyDB;
  with MyQuery do
  begin
    if FindField('GELOESCHT') <> Nil then
      SQL.Text := ' Select ' + aFeld + ' from ' + aTabelle + ' where ID = ' + aID.ToString +
                  ' and GELOESCHT = 0 '
    else
      SQL.Text := ' Select ' + aFeld + ' from ' + aTabelle + ' where ID = ' + aID.ToString;
    try
      open; //--> hier tritt der Fehler auf
      first;
      if (FieldByName(aFeld).AsString = '') or (FieldByName(aFeld).IsNull) or
        (Recordcount = 0) then
        Result := StrKeinEintrag
      else
        Result := FieldByName(aFeld).AsString;
    finally
      Close;
      Free;
    end;
  end;
end;
Meine Recherche in Google und hier im Forum waren erfolglos. Hat jemand eine Idee was das sein könnte?
Danke für euere Ideen.

VG Michael
Miniaturansicht angehängter Grafiken
fehlermeldung.jpg  
Michael H.
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.492 Beiträge
 
Delphi 7 Enterprise
 
#2

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 25. Jan 2022, 17:54
Welchen ODBC Treiber verwendest Du?
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
BerndS

Registriert seit: 8. Mär 2006
Ort: Jüterbog
491 Beiträge
 
Delphi 12 Athens
 
#3

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 25. Jan 2022, 18:10
Das hat zwar nichts mit der Fehlermeldung zu tun, aber FindField auf eine geschossene Query ohne Sql sollte doch immer nil sein.
Weiterhin sollte nach
   MyQuery := TFDQuery.Create(MyDB); ein try folgen sonst bleibt die MyQuery bei einer Exception beim Open im Speicher.

Delphi-Quellcode:
function GetFeldwertFromID(aTabelle, aFeld: string; aID: integer): Variant;
var
  MyQuery: TFDQuery;
begin
  if aID = 0 then
    exit;
  MyQuery := TFDQuery.Create(MyDB);
  try
    MyQuery.Connection := MyDB;
    with MyQuery do
    begin
      ...
      try
        open; //--> hier tritt der Fehler auf
        first;
        if (FieldByName(aFeld).AsString = '') or (FieldByName(aFeld).IsNull) or
          (Recordcount = 0) then
          Result := StrKeinEintrag
        else
          Result := FieldByName(aFeld).AsString;
      finally
        Close;
      end;
    end;
  finally
    MyQuery.Free;
  end;
end;
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#4

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 25. Jan 2022, 18:35
Nicht immer ... man könnte die Fields auch vorher erstellt haben. (was hier aber nicht gemacht wird, also Ja, ist immer Nil)


Zitat:
Delphi-Quellcode:
if (FieldByName(aFeld).AsString = '') or (FieldByName(aFeld).IsNull) or
        (Recordcount = 0) then
if FieldByName(aFeld).AsString = 'then oder if FieldByName(aFeld).AsString.IsEmpty then
Bei NULL liefert AsString immer einen LeerString und auch bei RecordCount=0 ist es NULL (also '').

Manche Datenbankkomponenten haben eigene TFields, wo es direkt ein IsEmpty oder IsEmptyOrNull gibt (für String-Fields also bei NULL oder '' )
if FieldByName(aFeld).IsEmpty then
$2B or not $2B

Geändert von himitsu (25. Jan 2022 um 18:43 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
691 Beiträge
 
Delphi 10.3 Rio
 
#5

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 26. Jan 2022, 07:47
Und wieder mal ein with und keiner sagt was. Das ist eine Art von Schreibfaulheit die früher oder später zu sehr schönen Fehlern führen wird.

Schau mal nach was in dem Fall in aFeld und aTabelle steht.
Ich denke aber es liegt daran : aID.ToString . Ändere das mal um in IntToStr(aID.AsInteger) Wenn aID NULL ist bleibt der String leer und die Abfrage ist fehlerhaft.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.

Geändert von Sinspin (26. Jan 2022 um 07:55 Uhr)
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 26. Jan 2022, 08:34
aId kann eigentlich, da es als Parameter der Funtione deklariert ist, nicht "null" sein.

versuche es mal so:

Delphi-Quellcode:
function GetFeldwertFromID(aTabelle, aFeld: string; aID: integer = 0): Variant;
var
  MyQuery: TFDQuery;
begin
  if aID = 0 then
    exit;
  MyQuery := TFDQuery.Create(nil);
  try
    myQuery.Connection := myDb;
    if myQuery.Connection.Connected then
    begin
      if myQuery.FindField('GELOESCHT') <> Nil then
        myQuery.SQL.Text := 'Select :aFeld from &aTabelle where ID = :aID '+
                    ' and GELOESCHT = 0 '
      else
        myQuery.SQL.Text := 'Select :aFeld from &aTabelle where ID = :aID ';

      myQuery.ParamByName('aFeld').AsString := aFeld;
      //myQuery.ParamByName('aTabelle').AsString := aTabelle;
      myQuery.MacroByName('aTabelle').AsString := aTabelle;
      myQuery.ParamByName('aId').AsInteger := aId;
      try
        myQuery.Open; //--> hier tritt der Fehler auf
        if myQuery.Recordcount = 0 then
          Result := 'Kein Eintrag'
        else
          Result := myQuery.FieldByName(aFeld).AsString;
      except
        raise;
      end;
    end;
  finally
    myQuery.Close;
    myQuery.Free;
  end;
end;
Grüße
Klaus
Klaus

Geändert von Klaus01 (26. Jan 2022 um 09:16 Uhr) Grund: Korrektur wegen untenstehendem Kommentar
  Mit Zitat antworten Zitat
Frickler

Registriert seit: 6. Mär 2007
Ort: Osnabrück
599 Beiträge
 
Delphi XE6 Enterprise
 
#7

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 26. Jan 2022, 09:11
Code:
'Select :aFeld from :aTabelle where ID = :aID '
Das dürfte so nicht gehen. Der Tabellenname kann kein Parameter sein, wohl aber ein Macro:
Code:
'Select :aFeld from &aTabelle where ID = :aID '
und dann
Code:
myQuery.MacroByName('aTabelle').AsString := aTabelle;
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.771 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 26. Jan 2022, 09:17
Code:
'Select :aFeld from :aTabelle where ID = :aID '
Das dürfte so nicht gehen.
danke - habe es im Beispiel ausgebessert.
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.184 Beiträge
 
Delphi 12 Athens
 
#9

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 26. Jan 2022, 13:33
Zitat:
Delphi-Quellcode:
if aID = 0 then
  exit;
Exit, ohne vorher das Result zu initialisieren ... selbst Schuld, wenn es hier mal ein Problem gibt.
(dein Pech, dass die entsprechende Compilerwarnung für gemagte Typen leider nicht kommt)

Beispiel: rufe deine Funktion zwei Mal hintereinander auf, oder in einer Schleife ... dann wirst du viel Spaß haben.


Vorher abfragen, ob es das Feld gibt
Delphi-Quellcode:
if myDb.Connected and (aID <> 0) then
begin
  MyQuery := TFDQuery.Create(nil);
  try
    myQuery.Connection := myDb;

    myQuery.SQL.Text := 'select * from &aTabelle limit 0';
    myQuery.MacroByName('aTabelle').Value := aTabelle;
    myQuery.Open;
    if myQuery.FindField('GELOESCHT') <> nil then
      myQuery.SQL.Text := 'select :aFeld from &aTabelle where ID = :aID '
                        + ' and GELOESCHT = 0 '
    else
      myQuery.SQL.Text := 'select :aFeld from &aTabelle where ID = :aID ';
    myQuery.Close;

    myQuery.ParamByName('aFeld').AsString := aFeld;
    myQuery.MacroByName('aTabelle').Value := aTabelle;
    myQuery.ParamByName('aId').AsInteger := aId;
    myQuery.Open;
    Result := myQuery.FieldByName(aFeld).Value;
  finally
    myQuery.Free;
  end;
end
else
  Exit(Null);
oder nachher dessen Wert prüfen, wenn es das Feld gibt
Delphi-Quellcode:
Result := Null;
if myDb.Connected and (aID <> 0) then
begin
  MyQuery := TFDQuery.Create(nil);
  try
    myQuery.Connection := myDb;
    myQuery.SQL.Text := 'select * from &aTabelle where ID = :aID ';
    myQuery.ParamByName('aFeld').AsString := aFeld;
    myQuery.MacroByName('aTabelle').Value := aTabelle;
    myQuery.ParamByName('aId').AsInteger := aId;
    myQuery.Open;
    if (myQuery.FindField('GELOESCHT') <> nil) and (myQuery.FieldByName('GELOESCHT').AsInteger = 0) then
      Result := myQuery.FieldByName(aFeld).Value;
  finally
    myQuery.Free;
  end;
end;
oder falls es Gelöscht und Nicht-Gelöscht gleichzeitig geben kann
Delphi-Quellcode:
    myQuery.Open;
    if (myQuery.FindField('GELOESCHT') = nil) or myQuery.Locate('GELOESCHT', 0, []) then
      Result := myQuery.FieldByName(aFeld).Value;
  finally
$2B or not $2B
  Mit Zitat antworten Zitat
Humbucker

Registriert seit: 8. Feb 2013
Ort: im Lahntal
35 Beiträge
 
Delphi 10.4 Sydney
 
#10

AW: Fehlermeldung beim Zugriff auf die Datenbank

  Alt 3. Feb 2022, 10:46
Hallo Bernd,

danke für die Nachricht.

Das hat zwar nichts mit der Fehlermeldung zu tun, aber FindField auf eine geschossene Query ohne Sql sollte doch immer nil sein.
tatsächlich: Ich habe zu viel an der Routine geschraubt: Die Abfrage auf FindField wird immer NIL sein, da zuvor die Query nicht aktiv wurde. -> Ändert aber leider nichts an der Fehlersituation, da in jedem Fall ein SQL.Text zugewiesen wird und der darauf folgende Open (einmalig) die Exeption wirft.

Weiterhin sollte nach
   MyQuery := TFDQuery.Create(MyDB); ein try folgen sonst bleibt die MyQuery bei einer Exception beim Open im Speicher.
Ich vermute dein Kommentar bezieht sich mehr auf das Finally, wodurch ein auftretender Fehler im Stack bleibt. Auch diese Anregung nehme ich gerne auf. Vielen Dank.

Gruß Michael
Michael H.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    

 

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:28 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz