Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   ADO.Open wirft exception falls IsEmpty (https://www.delphipraxis.net/187574-ado-open-wirft-exception-falls-isempty.html)

HJay 10. Dez 2015 15:21

Datenbank: MSSQL • Version: ? • Zugriff über: ADO

ADO.Open wirft exception falls IsEmpty
 
Code:
  myADO := TADOQuery.Create(nil);
  myADO.ConnectionString := ACS;
  myADO.Prepared        := True;
  myADO.SQL.Clear;
  myADO.SQL.Add(ASQL);

  myADO.Open; // exception, falls kein Dataset

  if not myADO.IsEmpty then begin ... end
Der SQL-Befehl ist fehlerfrei. Wenn die Abfrage eine Ergebnismenge zurückliefert, klappt alles einwandfrei. Wenn aber keine Datensätze zurückgegeben weden, gibt es eine entsprechende Exception bei myADO.Open ("CommandText liefert keine Ergebnismenge")

Kann man die ADO-Komponente so einstellen, dass keine Exception bei leeren Datenmengen auftritt?

Wozu ist die Funktion IsEmpty gedacht, wenn doch ohnehin vorher eine Exception auftritt?

nahpets 10. Dez 2015 15:53

AW: ADO.Open wirft exception falls IsEmpty
 
Open funktioniert nur, wenn es sich um eine Select-Statement (also eine Abfrage) handelt. Bei Insert, Update... (also allen Manipulationen der Daten...) kommt besagte Fehlermeldung, man muss hier ExecSQL verwenden.

Eigentlich bekomme ich bei ADO.Open auch bei einer leeren Ergebnismenge keine Fehlermeldung bzw. es tritt keine Exception auf.

Zeig' uns bitte mal ein SQL-Statement, bei dem der Fehler auftritt, eventuell ist da ja was zu erkennen.

HJay 10. Dez 2015 16:09

AW: ADO.Open wirft exception falls IsEmpty
 
Es handelt sich um eine Stored Procedure, die an sich tadellos läuft und auf die ich keinen Einfluss habe. Wenn man sie in einer DB-Oberflöche aufruft, dann löuft sie ganz normal durch und liefert entweder Datensätze oder eben auch nicht.

Mich wundert eben, dass myADO.Open eine Exception wirft, wenn die Ergebnismenge leer ist.

vagtler 10. Dez 2015 16:28

AW: ADO.Open wirft exception falls IsEmpty
 
keine Ergebnismenge != leere Ergebnismenge

nahpets 10. Dez 2015 16:30

AW: ADO.Open wirft exception falls IsEmpty
 
Also, das ist erstmal merkwürdig.

Ein
SQL-Code:
select * from tabelle where 1 = 2
liefert eine leere Ergebnismenge und funktioniert mit Open.

Die leere Datenmenge ansich kann also nicht das Problem sein.

Meine Vermutung wäre in diesem Fall:

Die Stored Procedure liefert, wenn sie keine Ergebnisse liefern kann, keine leere Ergebnismenge sondern entweder nichts oder sonst irgendwas anderes. Kannst Du uns diese Prozedure mal zeigen oder herausbekommen, was sie zurück gibt, wenn keine Ergebnismenge zurückgegeben werden kann?

jobo 10. Dez 2015 16:44

AW: ADO.Open wirft exception falls IsEmpty
 
Auch wenn Du keinen Einfluss auf die SP hast, hast Du vielleicht Einblick in den Code und kannst sie auf Ihr Rückgabeverhalten testen. Enthält die SP selbst vielleicht auch Exception Handling (mit Fehlerunterdrückung) und gibt im Fehlerfall was ganz anderes zurück als im Normalfall?
Also was zeigt ein SQL Werkzeug, wenn es die leere Datenmenge zurückgibt.
Vielleicht einfach NULL oder eine Record Struktur, wenn ja, welche Typen? Kann ADO bzw. der Treiber, den Du verwendest damit umgehen?
Ist der Treiber aktuell? Welcher?

HJay 11. Dez 2015 10:40

AW: ADO.Open wirft exception falls IsEmpty
 
Zitat:

Zitat von vagtler (Beitrag 1324018)
keine Ergebnismenge != leere Ergebnismenge

Ich denke, diese Anmerkung wird letztlich zielführend sein. Mir war der Unterschied so nicht bewusst. Der DB-Administrator überprüft die Stored procedure.

Danke für Eure Kommentare!

jobo 11. Dez 2015 13:42

AW: ADO.Open wirft exception falls IsEmpty
 
Zitat:

Zitat von HJay (Beitrag 1324082)
Der DB-Administrator überprüft die Stored procedure.

Es würde mich interessieren, wie das Ergebnis davon aussieht.
Ich hatte erst vor wenigen Tagen einen Effekt in java, dass ein Select mit json Typ Konvertierung bei einem bestimmten Wert aussteigt. Der Server macht dazu zwar das log voll, aber der Effekt im Dataset ist lediglich eine ungewöhnlich kleine Datenmenge, eben bis zu der Stelle, wo sich die Daten nicht konvertieren lassen.


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