Adapter.Fill

16/09/2008 - 01:18 von Jan | Report spam
Hallo NG,

Zur Arbeit mit dem DataAdapter-Objekt habe ich ein paar Verstàndnisfragen:

Zuerst erstelle ich einen DataAdapter und ordne ihm eine SQL-Abfrage und
eine Verbindung zu:

SqlDataAdapter dataAdapter = new SqlDataAdapter();
SqlCommand sqlCommand = new SqlCommand("SELECT * FROM Kunden, connection);
dataAdapter.SelectCommand = sqlCommand;

Soweit ich die einschlàgige Literatur verstanden habe, wird die Abfrage nun
aber erst gegen die Datenbank abgesetzt, wenn ich auch die Fill-Methode
aufrufe und die Ergebnismenge beispielsweise in eine DataTable schreibe:

dataAdapter.Fill(dataTable);

Dafür liegt jetzt die geamte Ergebnismenge im Hauptspeicher vor, was ich bei
größeren Ergebnistabellen z. B. auf einem Webserver irgendwie beunruhigend
finde, oder ist das Quatsch?

Wenn ich jetzt ein manuelles Paging programmieren möchte, kann ich die
Ergebnismenge mit der Fill-Methode einschrànken:

dataAdapter.Fill(1, 5, dataTable);

Liegt jetzt wirklich nur der "Ausschnitt" von 5 Datensàtzen im Hauptspeicher
des Servers vor?

Und bekomme ich irgendwie heraus, wieviele Datensàtze die SELECT-Abfrage
tatsàchlich geliefert hat? Oder muß ich, um das herauszufinden, eine zweite
Abfrage, etwa SELECT COUNT(*) FROM Kunden fahren?

Im neuen .NET 3.5 Framework scheint es ja einen Pager zu geben, leider steht
aber nur .NET 2.0 zur Verfügung.

Viele Grüße

Jan
 

Lesen sie die antworten

#1 Peter Fleischer
16/09/2008 - 06:58 | Warnen spam
"Jan" schrieb im Newsbeitrag
news:

Soweit ich die einschlàgige Literatur verstanden habe, wird die Abfrage
nun
aber erst gegen die Datenbank abgesetzt, wenn ich auch die Fill-Methode
aufrufe und die Ergebnismenge beispielsweise in eine DataTable schreibe:

dataAdapter.Fill(dataTable);



Genau so ist es. Üblicherweise führt erst der Aufruf einer Methode eine
konkrete Aktion aus.

Dafür liegt jetzt die geamte Ergebnismenge im Hauptspeicher vor, was ich
bei
größeren Ergebnistabellen z. B. auf einem Webserver irgendwie beunruhigend
finde, oder ist das Quatsch?



Das ist kein Quatsch und hat aber nichts mit einem WebServer zu tun. Wenn
die Ergebnissmenge, die in den Datenpuffer im Client geladen wird, sehr groß
ist, werden viele Ressourcen gebunden (Netzlast, RAM und ggf.
Plattenspeicher für die ausgelagerten Seiten des virtuellen Speichers).

Wenn ich jetzt ein manuelles Paging programmieren möchte, kann ich die
Ergebnismenge mit der Fill-Methode einschrànken:

dataAdapter.Fill(1, 5, dataTable);



Jein. Die im Client gepufferte Datenmenge ist entsprechend klein. Übertragen
wird aber von Anfang an bis zum Abbruch, d.h. es gibt ein großes
Transfervolumen und entsprechende Netzlast.

Liegt jetzt wirklich nur der "Ausschnitt" von 5 Datensàtzen im
Hauptspeicher
des Servers vor?



Nein, im Server wird alles bis zum Abbruch aufbereitet, im Client verbleibt
nur die "ausgeschnittene" Menge.

Und bekomme ich irgendwie heraus, wieviele Datensàtze die SELECT-Abfrage
tatsàchlich geliefert hat?



Fill hat einen Rückgabewert.

Oder muß ich, um das herauszufinden, eine zweite
Abfrage, etwa SELECT COUNT(*) FROM Kunden fahren?



Wenn im vorhinein, dann nur so.

Im neuen .NET 3.5 Framework scheint es ja einen Pager zu geben, leider
steht
aber nur .NET 2.0 zur Verfügung.



Paging ist in erster Linie eine Funktion des Datenbankservers. Wenn der von
dir genutzte Datenbankserver ein Paging unterstützt, dann kannst du das auch
schon im .NET 2.0 nutzen. Bei Oracle ist das beispielsweise LIMIT und
OFFSET.

Du erhöhst Deine Chance, dass Deine Frage überhaupt gelesen und qualifiziert
und schnell beantwortet wird, wenn Du Deinen Realnamen im Absender
einstellst (Vor- und Zuname).

Viele Gruesse

Peter

Ähnliche fragen