Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Fehlermeldung beim Zugriff auf die Datenbank (https://www.delphipraxis.net/209812-fehlermeldung-beim-zugriff-auf-die-datenbank.html)

Humbucker 25. Jan 2022 16:14

Datenbank: Microsoft Access • Version: 2012 • Zugriff über: FireDAC

Fehlermeldung beim Zugriff auf die Datenbank
 
Liste der Anhänge anzeigen (Anzahl: 1)
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.:gruebel:

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

Union 25. Jan 2022 16:54

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Welchen ODBC Treiber verwendest Du?

BerndS 25. Jan 2022 17:10

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
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
Delphi-Quellcode:
   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;

himitsu 25. Jan 2022 17:35

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
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

Delphi-Quellcode:
if FieldByName(aFeld).AsString = '' then
oder
Delphi-Quellcode:
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 '' )
Delphi-Quellcode:
if FieldByName(aFeld).IsEmpty then

Sinspin 26. Jan 2022 06:47

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Und wieder mal ein
Delphi-Quellcode:
with
und keiner sagt was. :roll: 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 :
Delphi-Quellcode:
aID.ToString
. Ändere das mal um in
Delphi-Quellcode:
IntToStr(aID.AsInteger)
Wenn aID NULL ist bleibt der String leer und die Abfrage ist fehlerhaft.

Klaus01 26. Jan 2022 07:34

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
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

Frickler 26. Jan 2022 08:11

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Klaus01 (Beitrag 1501197)
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;

Klaus01 26. Jan 2022 08:17

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Frickler (Beitrag 1501198)
Zitat:

Zitat von Klaus01 (Beitrag 1501197)
Code:
'Select :aFeld from :aTabelle where ID = :aID '

Das dürfte so nicht gehen.

danke - habe es im Beispiel ausgebessert.

himitsu 26. Jan 2022 12:33

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
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

Humbucker 3. Feb 2022 09:46

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Bernd,

danke für die Nachricht.

Zitat:

Zitat von BerndS (Beitrag 1501186)
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.

Zitat:

Zitat von BerndS (Beitrag 1501186)
Weiterhin sollte nach
Delphi-Quellcode:
   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

Humbucker 3. Feb 2022 09:52

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Union (Beitrag 1501184)
Welchen ODBC Treiber verwendest Du?

Delphi-Quellcode:
Database.DriverID := 'MSAcc';

Humbucker 3. Feb 2022 10:08

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von himitsu (Beitrag 1501187)
Nicht immer ... man könnte die Fields auch vorher erstellt haben. (was hier aber nicht gemacht wird, also Ja, ist immer Nil)

Delphi-Quellcode:
if FieldByName(aFeld).AsString = '' then
oder
Delphi-Quellcode:
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 '' )
Delphi-Quellcode:
if FieldByName(aFeld).IsEmpty then

Hallo Himitsu,

ist es sinnvoll die Änderung so
Delphi-Quellcode:
if (FieldByName(aFeld).asString.IsEmpty) or (FieldByName(aFeld).IsNull) or
        (Recordcount = 0) then
oder so

if FieldByName(aFeld).asString.IsEmpty then
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.

Danke für deine Antwort.

Gruß Michael

Humbucker 3. Feb 2022 10:58

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Klaus01 (Beitrag 1501199)
Zitat:

Zitat von Frickler (Beitrag 1501198)
Zitat:

Zitat von Klaus01 (Beitrag 1501197)
Code:
'Select :aFeld from :aTabelle where ID = :aID '

Das dürfte so nicht gehen.

danke - habe es im Beispiel ausgebessert.

Hallo Klaus,

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

Humbucker 3. Feb 2022 11:09

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
[QUOTE=himitsu;1501211]
Zitat:

Delphi-Quellcode:
    myQuery.Open;
    if (myQuery.FindField('GELOESCHT') = nil) or myQuery.Locate('GELOESCHT', 0, []) then
      Result := myQuery.FieldByName(aFeld).Value;
  finally

Danke für diesen Lösungsansatz. :thumb:

Gruß Michael

Humbucker 3. Feb 2022 12:38

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:
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;
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.

Was mich übrigens noch interessieren würde ist:
Zitat:

Zitat von Sinspin (Beitrag 1501194)
Und wieder mal ein
Delphi-Quellcode:
with
und keiner sagt was. :roll: Das ist eine Art von Schreibfaulheit die früher oder später zu sehr schönen Fehlern führen wird.

Was ist an WITH so "schlimm"? Welche Fehler treten durch WITH auf?

Gruß Michael

Jasocul 3. Feb 2022 12:47

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Humbucker (Beitrag 1501642)
Was ist an WITH so "schlimm"? Welche Fehler treten durch WITH auf?

Abgesehen davon, dass Debugging in so einem Bereich kaum möglich ist?
Hier das aktuellste Beispiel

Uwe Raabe 3. Feb 2022 12:49

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Humbucker (Beitrag 1501642)
Was ist an WITH so "schlimm"? Welche Fehler treten durch WITH auf?

Schon etwas älter: The with-statement considered harmful

Humbucker 3. Feb 2022 14:33

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1501646)
Zitat:

Zitat von Humbucker (Beitrag 1501642)
Was ist an WITH so "schlimm"? Welche Fehler treten durch WITH auf?

Schon etwas älter: The with-statement considered harmful

OK. Das ist nachvollziehbar. Also dann ab jetzt kein WITH mehr :oops::dp:

Delphi.Narium 3. Feb 2022 17:41

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Persönlich würd' ich diesen Teil umbauen:
Delphi-Quellcode:
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;
In etwa so (das with lassen wir jetzt mal wie es ist, auch wenn ich es überhauptnicht mag ;-)):
Delphi-Quellcode:
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;
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.
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:
not (FieldByName(aFeld).IsNull)
auch noch prüfen, ob
Delphi-Quellcode:
and not (FindField(aFeld) = nil)
, derweil: Das könnte (theoretisch) auch noch schief gehen.

Humbucker 7. Feb 2022 14:17

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Delphi.Narium (Beitrag 1501667)
Delphi-Quellcode:
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;

Nice :thumb:

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;

Humbucker 7. Feb 2022 14:19

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Leider hat noch niemand wegen der ursprünglichen Fehlermeldung in Bezug auf die Datenbank etwas gepostet. Hat niemand eine Idee was das sein könnte - siehe Beitrag #1

VG Michael

Union 7. Feb 2022 15:00

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Humbucker (Beitrag 1501620)
Zitat:

Zitat von Union (Beitrag 1501184)
Welchen ODBC Treiber verwendest Du?

Delphi-Quellcode:
Database.DriverID := 'MSAcc';

Ich meine den tatsächlichen Treiber. Nicht die Driver-ID der Verbindung. Du musst dort einen aktuellen v16 ODBC-Treiber einstellen (i.e. "Microsoft Access database", "32-bit", "Microsoft Access Driver (*.mdb, *.accdb)".

Ältere Treiber (v10) funktionieren u.U. nicht.

Jasocul 7. Feb 2022 15:11

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Um den Fehler einzugrenzen, würde ich das SQL-Statement vor dem Open kopieren und prüfen, ob das grundsätzlich korrekt ist. Am Besten in einem passenden SQL-Editor ansehen und laufen lassen.

Wenn das funktioniert, vermute ich das Problem am Treiber (wie schon mehrfach vermutet wird) oder es gibt ein Initialisierungsproblem.

Was mir gerade noch einfällt:
Du weist die Connection in der Routine zu. Ist die Connection denn aktiv? Meistens werden Connections durch ein auszuführendes Query zwar implizit aktiv, aber erstens geht es hier um Access und zweitens um einen ODBC-Treiber. Es könnte also durchaus sein, dass die Connection noch gar nicht bereit, bzw. nicht schnell genug bereit ist. Das würde dann auch erklären, warum es nur beim ersten Durchlauf Probleme gibt.

Humbucker 18. Feb 2022 09:10

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Union (Beitrag 1501833)
Zitat:

Zitat von Humbucker (Beitrag 1501620)
Zitat:

Zitat von Union (Beitrag 1501184)
Welchen ODBC Treiber verwendest Du?

Delphi-Quellcode:
Database.DriverID := 'MSAcc';

Ich meine den tatsächlichen Treiber. Nicht die Driver-ID der Verbindung. Du musst dort einen aktuellen v16 ODBC-Treiber einstellen (i.e. "Microsoft Access database", "32-bit", "Microsoft Access Driver (*.mdb, *.accdb)".

Ältere Treiber (v10) funktionieren u.U. nicht.

Den benutze ich: Provider=Microsoft.ACE.OLEDB.16.0

Humbucker 18. Feb 2022 09:44

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Forum,

erst mal danke für die Antworten.

Zitat:

Zitat von Jasocul (Beitrag 1501834)
Um den Fehler einzugrenzen, würde ich das SQL-Statement vor dem Open kopieren und prüfen, ob das grundsätzlich korrekt ist. Am Besten in einem passenden SQL-Editor ansehen und laufen lassen.

Das funktioniert einwandfrei. Ich verwende Microsoft Access 365 und erzeuge hier eine SQL-Abfrage:
Code:
Select * from Adresse where ID = 1.
- so wirklich nichts spektakuläres.

Zitat:

Was mir gerade noch einfällt:
Du weist die Connection in der Routine zu. Ist die Connection denn aktiv? Meistens werden Connections durch ein auszuführendes Query zwar implizit aktiv, aber erstens geht es hier um Access und zweitens um einen ODBC-Treiber. Es könnte also durchaus sein, dass die Connection noch gar nicht bereit, bzw. nicht schnell genug bereit ist. Das würde dann auch erklären, warum es nur beim ersten Durchlauf Probleme gibt.
Die FDConnection (MyDB) ist geöffnet und verbunden. In der Routine wird das auch überprüft.
Delphi-Quellcode:
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;
        .....
      except
        raise;
      end;
Das scheidet als Fehlerursache meines Erachtens aus. Zumal die Fehlermeldung auch keine Exception auslöst, was bei einer nicht geöffneten Connection der Fall wäre.

VG Michael

Humbucker 24. Feb 2022 08:48

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Forum,

ich habe einen Case bei Embarcadero aufgemacht und von dort die Information erhalten, dass das gemeldete Problem bisher nicht bekannt ist. Außerdem würde FireDAC intern (es wird intern eine ODBC-Verbindung aufgebaut) ausschließlich den 'Microsoft.ACE.OLEDB.12.0' (Microsoft Access 2007) unterstützen???

Zitat:

I suspect it might an interface that is not being released but looking at the code where the exception is generated I see this:

in FireDAC.Phys.MSAcc.pas

procedure CompactRepairJRO(const ADestDB: String); ...
case DBVersion of
avDefault:
begin
if sDrv = 'Microsoft Access Driver (*.mdb, *.accdb)' then
sProvider := 'Microsoft.ACE.OLEDB.12.0'
else
sProvider := 'Microsoft.Jet.OLEDB.4.0';
end;
...

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

So it looks to me as it FireDAC is looking to 'Microsoft.ACE.OLEDB.12.0' default?
Besonders unangenehm ist, dass die Installation von Microsoft Office 365 die Treiberstruktur von 'Microsoft.ACE.OLEDB.12.0' verändert; sogar wenn im Nachgang der Treiber für Microsoft Access 2007 erneut installiert wird. Anscheinend wird durch die regelmäßigen Updates von Office 365 der Treiber 'Microsoft.ACE.OLEDB.12.0' immer wieder verändert.

Insofern könnte die Beschränkung von FireDAC auf die Verwendung des Microsoft Access 2007 Treiber ein massives Problem nach sich ziehen, da die Koexistenz einer Delphi Anwendung auf Basis von FD mit Microsoft Office 365 nicht mehr möglich wäre.

Ich halte euch auf dem Laufenden ...

VG Micheal

Alfredo 24. Feb 2022 10:27

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Michael,

deine Ausgangsfrage ging von Access 2012 und Firedac aus und das funktioniert bei mir mit Delphi 11.

Access 365 ist eine andere Baustelle und hat bei mir Hausverbot.

Gruß
Alfred

Alfredo 25. Feb 2022 09:37

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Michael,

die Problemkreise 32Bit/64bit auf Seiten von Access geprüft?

Problem "2 Accessversionen auf einem Rechner?" geprüft?

Gruß
Alfred

jacksonjayden 8. Mär 2022 07:53

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Erstellen Sie eine Sicherungskopie der ursprünglichen Datenbank. Versuchen Sie, diese Datenbank zu öffnen. Wenn Sie eine MDB-Datenbank im Access 97- oder Access 95-Dateiformat öffnen, zeigt Access das Dialogfeld Datenbankerweiterung an. Sie werden aufgefordert, die Datenbank zu aktualisieren.14-Feb-2022
.................................................. ...............................
Fashion Mentions is one-stop destination for Latest Fashion Trends, Skin Care,insider beauty secrets, Makeup product reviews, and more

Humbucker 22. Mär 2022 16:27

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Alfredo (Beitrag 1502649)
Hallo Michael,

deine Ausgangsfrage ging von Access 2012 und Firedac aus und das funktioniert bei mir mit Delphi 11.

Access 365 ist eine andere Baustelle und hat bei mir Hausverbot.

Gruß
Alfred

Hallo Alfred,

das ist auch so im Test. Der ursprünglich verwendete und getestete Treiber ist Access 2007. Aber ich habe halt die Erfahrung machen müssen, dass eine Office 365 Installation (egal ob auf eine Kundensystem oder auf einem Testsystem), den Access 2007 Treiber korrumpiert. Das Problem ist auch dann nur noch temporär über eine Reparaturinstallation des Access 2007 Treiber (Runtime) zu beheben.

Aber leider kann ich meinen Kunden Office 365 nicht verbieten :wink:

btw. das Problem hängt auch nicht nicht mit den Treibern zusammen, da es in jeder Konstellation auftritt.

VG Michael

Humbucker 22. Mär 2022 16:30

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von Alfredo (Beitrag 1502687)
Hallo Michael,

die Problemkreise 32Bit/64bit auf Seiten von Access geprüft?

Problem "2 Accessversionen auf einem Rechner?" geprüft?

Gruß
Alfred

Hallo nochmal,

die Anwendung wird nur in 32-Bit für Access bereit gestellt - insofern wurde auch nur mit 32 Bit Anwendung und Treiber getestet.

VG Michael

Humbucker 22. Mär 2022 16:32

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Zitat:

Zitat von jacksonjayden (Beitrag 1503030)
Erstellen Sie eine Sicherungskopie der ursprünglichen Datenbank. Versuchen Sie, diese Datenbank zu öffnen. Wenn Sie eine MDB-Datenbank im Access 97- oder Access 95-Dateiformat öffnen, zeigt Access das Dialogfeld Datenbankerweiterung an. Sie werden aufgefordert, die Datenbank zu aktualisieren.14-Feb-2022
.................................................. ...............................
Fashion Mentions is one-stop destination for Latest Fashion Trends, Skin Care,insider beauty secrets, Makeup product reviews, and more

Hallo jacksonjayden,

es ist schon eine Microsoft Access 2007 Datenbank. Die Datenbank hat eine Erweiterung .ACCDB und wird auch über die entsprechenden Treiber angesprochen.

VG Michael

Humbucker 22. Mär 2022 16:42

AW: Fehlermeldung beim Zugriff auf die Datenbank
 
Hallo Forum,

heute habe ich eine Entdeckung gemacht, die mich der Lösung des Problem (zumindest an der derzeit betreffenden Stelle im Code) weiter gebracht hat: Ich habe festgestellt, dass die Fehlermeldung anscheinend mit der Verwendung von Views zusammenhängt.

Ich hatte die betreffende Abfrage auf einen View bezogen, der Adressdaten aus einer Basistabelle aufbereitet. Wenn ich in der Abfrage den View (Adresse) gegen die Basistabelle (Adressen) austausche, wird keine Fehlermeldung mehr ausgegeben.

Allerdings verlagert sich das Problem auf die nächste Abfrage, die auf einen View zugreift. Ich werde dieser Spur nachgehen und halte euch auf dem Laufenden.

VG Michael

P.S.: Ich habe zwischenzeitlich mit den Views in der Access Datenbank herumgespielt um herauszufinden, ob die Komplexität der SQL-Abfrage mit der Fehlermeldung in Verbindung steht. Dem ist nicht so, denn auch ein View mit eine sehr einfachen SQL-Abfrage löst das Problem aus.
Code:
select * from Adressen


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