Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Erfahrungen mit Abfragen, die mehrere Ergebnismengen liefern (https://www.delphipraxis.net/14467-erfahrungen-mit-abfragen-die-mehrere-ergebnismengen-liefern.html)

Leuselator 9. Jan 2004 19:39


Erfahrungen mit Abfragen, die mehrere Ergebnismengen liefern
 
Hallo Gemeinde,

hat hier irgendwer Erfahrungen mit der Verarbeitung von SQL-Abfragen, die mehrere Ergebnismengen liefern?

Ich meine folgendes (Beispiel ohne wirklichen Sinn):
Delphi-Quellcode:
DieAbfrage : TQuery/TAdoQuery/TAdoDataSet; // je nachdem - unwichtig...
...
DieAbfrage.SQL.Add('select * from TabelleA');
DieAbfrage.SQL.Add('select * from TabelleB');
...
DieAbfrage.Open;
end;
Gruß

Jens Schumann 9. Jan 2004 19:54

Re: Erfahrungen mit Abfragen, die mehrere Ergebnismengen lie
 
Hallo Leuselator,
bist Du Dir sicher, dass das funktioniert. Von sowas habe ich weder gehört noch gelesen.
Ich denke es wird (wenn keine Fehlermeldung vom Server kommt) die erste Ergebnismenge
verworfen wenn das zweite Statement ausgeführt wird.

Leuselator 9. Jan 2004 19:59

Re: Erfahrungen mit Abfragen, die mehrere Ergebnismengen lie
 
Hi Jens,
Das geht (jedenfalls mit MSSQL-2000, wer will kanns mit QueryAnalyzer und DB Northwind ausprobieren) und würde an einer Stelle für mich auch richtig Sinn machen.

Auf jeden Fall wird es mit den DataSets eine Trickserei sein, Ziel dieses Threads war, herauszufinden ob jemand sich schonmal an der Erfindung dieses Fahrrads versucht hat.
Gruß

SirThornberry 9. Jan 2004 20:12

Re: Erfahrungen mit Abfragen, die mehrere Ergebnismengen lie
 
Also mit delphi dürfte das nicht gehen. Die Programme die ich kenne mit denen man zwei abfragen absendet führen beide hintereinander aus, werden also vor dem absenden auseinander gebastelt

MrSpock 9. Jan 2004 20:59

Re: Erfahrungen mit Abfragen, die mehrere Ergebnismengen lie
 
Hallo Leuselator,

die einzige Möglichkeit, die SQL hier bietet ist die UNION Anweisung, die aber nur funktioniert, wenn beide Abfragen eine Datenmenge zurückliefern, die eine identische Struktur hat (die Feldnamen dürfen dabei ruhig unterschiedlich sein, dann solltest du aber noch den AS Operator verwenden, um festzulegen, wie das Feld der Vereinigung heißen soll.

Leuselator 13. Jan 2004 23:22

Re: Erfahrungen mit Abfragen, die mehrere Ergebnismengen lie
 
@Thema: ich komme auf die Idee, weil im PSDK zu finden ist:
Zitat:

Receiving Multiple Recordsets
The Microsoft OLE DB Provider for SQL Server supports returning multiple Recordset objects for a single command containing multiple SQL statements, one Recordset per SQL statement. The order in which the Recordsets are returned follows the order in which the SQL statements are placed in the command text.

The first code example in this section demonstrates this feature by querying two tables, Orders and Customers, in the Northwind database to examine who is the customer whose ID is "ALFKI" and where are the orders shipped.

The Microsoft OLE DB Provider for SQL Server also returns multiple resultsets to ADO when the command contains a COMPUTE clause. For example, a command containing the following SQL statement—

SELECT ProductID, ProductName, UnitPrice
FROM PRODUCTS
COMPUTE AVG(UnitPrice)
—will return the results in two Recordset objects: one for the rowset of (ProductID, ProductName, UnitPrice), and the other for the average price of all products in the table. You can use the Recordset.NextRecordset method to enumerate the two objects as shown in the second code example in this section.
und siehe da TADODataSet kennt auch die Methode NextRecordSet! Das es trotzdem nicht auf Anhieb funktioniert hat, scheint daran zu liegen, dass das TAdoDataSet (auch BetterAdoDataSet) das 2. Select ignoriert?
Wenn ich jedoch auf dem Server eine Stored Procedure aufrufe, die mehrere RecordSets zurückliefert (und genau um diesen Fall gin es mir eigentlich) dann kann man mit:
Delphi-Quellcode:
var i : Integer;
try
  MeinAdoDataSet.RecordSet := MeinAdoDataSet.NextRecordSet(i);
except
  // Ende erreicht - keine weiteren RecordSets
end;
wunderbar die einzelnen Recordsets durchparsen. Allerdings nur 1x, von Anfang bis Ende ("PreviousRecordSet" gibts nicht)

@MrSpock: Werde trotzdem mal in der Richtung graben...

@All: Gruß


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