AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Datenbanken Exception bei leerem Result
Thema durchsuchen
Ansicht
Themen-Optionen

Exception bei leerem Result

Ein Thema von idefix2 · begonnen am 28. Jun 2010 · letzter Beitrag vom 3. Jul 2010
Antwort Antwort
blackfin
(Gast)

n/a Beiträge
 
#1

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 01:10
greifst du vielleicht nach der Abfrage gleich auf den ersten Record zu, ohne zu prüfen, ob er existiert?

denn der Fehlercode ist ja:

Zitat:
100335544374 stream_eof Attempt to fetch past the last record
in a record stream
Ich weiss jetzt nicht, was das fetch() bei UIB genau macht, da ich die Kompos selbst nicht benutze, aber wenn ich jetzt mal zu php ableite, dann
gibt es da ja z.B. das mysql_fetch_array(), was einen Record von einer Query holt.
Wenn die Query aber keine Result-Sets hat, spuckt auch mySQL/php dort eine Exception heraus, da es ja keine Records gibt, deswegen muss man dort erstmal z.B. mit
mysql_count_rows() abfragen, ob überhaupt Records als Ergebnis der Query vorhanden sind.
Könnte das vielleicht die Ursache sein? Dass du versuchst, einen Record zu holen, obwohl es keinen gibt?
Das ist alles nur eine Vermutung, da ich, wie gesagt, UIB nicht kenne...

Geändert von blackfin (29. Jun 2010 um 01:20 Uhr)
  Mit Zitat antworten Zitat
hoika

Registriert seit: 5. Jul 2006
Ort: Magdeburg
8.277 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 06:38
Hallo,

1. was sagt denn progdigy dazu ?

2. Probier mal CachedFetch=False
http://www.progdigy.com/forums/viewt...40b0e30efca645

2. ist nur so ne Überlegung.


Heiko
Heiko
  Mit Zitat antworten Zitat
Fuchtel

Registriert seit: 9. Nov 2005
Ort: Bamberg
55 Beiträge
 
Delphi 2005 Personal
 
#3

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 06:52
Hallo,

Im Zitat von blackfin steckt die Lösung:

Zitat:
100335544374 stream_eof Attempt to fetch past the last record
'

Code:
 If not Query.Eof then  
 begin
   // Auswertung
 end;
Query.Eof gibt an, ob das Ende des Querys schon erreicht ist.
Ist Deine Abfrage leer, ist es immer true.

Fuchtel
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#4

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 07:37
Leider ist es nicht so. Ich glaube ich habe oben ziemlich genau beschrieben, was das Problem ist. Ich bekomme die Exception schon beim Ausführen der Query, noch bevor ich irgendwelche Daten mittels Fetch hole. Aber sogar das sollte möglich sein, in den von UIB mitgelieferten Demoprogrammen (der einzigen "Dokumentation") ist die Konstruktion

Delphi-Quellcode:
    (* Prepare the statement. *)
    try
      UL.DSQLPrepare(DB, trans, stmt, sel_str, SQL_DIALECT, sqlda);
    except
      on E: Exception do
      begin
        WriteLn('Error: ',E.Message);
        ReadLn;
        raise;
      end;
    end;

    (* Execute the statement. *)
    UL.DSQLExecute(trans, stmt, SQL_DIALECT, nil);

    (*
    *    Fetch and print the records.
     *)

    while UL.DSQLFetch(DB, trans, stmt, 1, sqlda) do
      Writeln(format('%s %s %s', [sqlda.AsString[0], sqlda.AsString[1], sqlda.AsString[2]]));
d.h. laut diesem UIB-DemoProgramm sollte, wenn keine Daten mehr da sind, einfach fetch den Wert false liefern.

Das ganze passiert nicht in Verbindung mit einer Query-Komponente, sondern ich verwende nur die Basisunit "UIBLib", das ist eine Unit, die ein paar Klassen zur direkten Verwendung der Firebird API zur Verfügung stellt. Das Statusergebnis <> 0, das "schuld" an der Auslösung der Exception in der UIB Unit ist, kommt direkt aus der Firebird-DLL fbclient.dll beim Execute der Query zurück.

@heiko
Ja, progdigy ist wohl eher der richtige Platz, um die Frage zu stellen. Ich bin jetzt schon so gewohnt, dass hier auf so ziemlich alles eine brauchbare Antwort kommt
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu
Online

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

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 07:42
Delphi-Quellcode:
if UL.DSQLExecute(trans, stmt, SQL_DIALECT, nil) then
  while UL.DSQLFetch(DB, trans, stmt, 1, sqlda) do
    Writeln(format('%s %s %s', [sqlda.AsString[0], sqlda.AsString[1], sqlda.AsString[2]]));
Ich kenn diese Komponente(nsammlung) zwar auch nicht, aber was passiert denn hierbei?
(ich vermute mal DSQLExecute hat auch irgendeinen prüfbaren Rückgabewert)

PS: Gibt es eventuell irgendwo sowas wie einstellbare Optionen, bei dieser Komponente?
Wo man also einstellen kann, ob z.B. DSQLFetch eine Exception wirft oder nur False liefert.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#6

AW: Exception bei leerem Result

  Alt 29. Jun 2010, 09:47
Ich habe jetzt das Problem einmal im progdigy Forum geposted.

Die Klasse TUIBLibrary hat mehrere execute Methoden, die sich in den zu übergebenden Parametern unterscheiden.
Execute hat nur einen TParams Parameter, während Execute2 einen TParams und einen TResult Parameter hat. Ich war deshalb der Meinung, dass ich Execute2 verwenden muss, wenn ich ein Result erwarte - möglicherweise liegt da der Fehler, weil das Beispielprogramm verwendet execute und nicht execute2, und bekommt das Ergebnis im TParams zurück. Allerdings gibt es beim Beispielprogramm nicht gleichzeitig input und output Parameter. Ich werde jetzt in der Richtung weitersuchen, vielleicht komme ich doch noch drauf, wie es richtig geht
Ich hatte gehofft, dass irgendwer hier diese Library verwendet und die Lösung weiss, aber so verbreitet scheint sie doch nicht zu sein.


DSQLExecute ist eine procedure und hat keinen Rückgabewert. Das angeführte Codeschnipsel ist einem UIB Beispielprogramm entnommen, leider finde ich dort kein Beispiel, das einem SQL-Befehl Input Parameter übergibt und dann ein Resultset zurückgeliefert bekommt, sondern nur Beispiele mit SQL-Befehlen mit Parametern ohne Resultset und solche mit fixem SQL-Befehl mit Resultset, aber dafür ohne Parameter.
  Mit Zitat antworten Zitat
idefix2

Registriert seit: 17. Mär 2010
Ort: Wien
1.027 Beiträge
 
RAD-Studio 2009 Pro
 
#7

AW: Exception bei leerem Result

  Alt 3. Jul 2010, 08:08
Hallo, das Problem ist gelöst.

Die Firebird API kennt zwei verschiedene Execute Methoden, execute und execute2, und execute2 war die falsche .

Execute ist für Queries, die beliebig viele (zwischen 0 und n) Ergebniszeilen liefern, und hat keinen Result Parameter, weil die Ergebniszeilen danach mittels fetch der Reihe nach geholt werden müssen.
Execute2 ist für Queries, die genau eine Zeile als Ergebnis zurückliefern, und dieser Wert wird in der Result Variablen übergeben. Wenn es kein Ergebnis gibt, löst execute2 eine Exception aus.

Das Ganze ist, wie so vieles andere, nirgends richtig dokumentiert oder zumindest nicht so leicht zufinden, aber im progdigy Forum habe ich die Erklärungen bekommen. Der Hintergrund dazu ist im Firebird API Guide nachzulesen, wenn man dort gründlich danach sucht.

Geändert von idefix2 ( 3. Jul 2010 um 08:14 Uhr)
  Mit Zitat antworten Zitat
Antwort Antwort


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 17:59 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-2025 by Thomas Breitkreuz