PDA

Vollständige Version anzeigen : Verbindungsloses Arbeiten -> DataSets


peterpan
08.03.2004, 09:40
Hallo zusammen,

nachdem ich nun mit Begeisterung die ersten 10 Kapitel von "Jetzt lern ich ADO.NET, Markt+Technik" verschlungen habe und mich der Gedanke des verbindungslosen Arbeiten mit Datenbanken doch sehr faszinierte, stellt sich mir jetzt doch eine Frage, die bisher nicht in dem Buch beantwortet wird.

Ist das Arbeiten mit DataSets bei sehr großen Tabellen, die vielleicht mehr als eine Millionen Datensätze beinhalten sinnvoll? Da müssen doch riesige Datenmengen beim Start der Applikation übertragen werden. Ausserdem sind diese Daten sehr schnell nicht mehr aktuell, wenn viele Clients auf der Datenbank arbeiten. Oder habe ich das System jetzt vielleicht noch nicht richtig verstanden?

Danke für eure Antworten

TykaAndreas
08.03.2004, 12:13
10 Millionen DS musst du ja auch nicht unbedingt auf einmal ins Dataset holen
kann mir schwer vorstellen , dass es eien Db gibt mit 10 Millione DS die alle ein bestimmtes Kriterium erfüllen
aber selbst wenn das nun sein sollte,die fill Methode für ein DataAdapter ist überladen, es gibt die Möglichkeit nur die ersten 20 oder die ersten 30 von der Datenquelle zu holen

Code beispiel hab ich jetzt leider nicht, gibts aber eventuell auch in deinem Buch

TykaAndreas
08.03.2004, 19:16
hier ein Beispiel dazu, für ein datagrid sieht es sicher nicht viel anders aus

<div><link href="http://www.ms-office-forum.net/forum/externals/codeconv.css" rel="stylesheet"><pre><span class="TOKEN">Private Sub</span> Fill_Dataset_blaettern_Click(<span class="TOKEN">ByVal</span> sender <span class="TOKEN">As</span> System.Object, <span class="TOKEN">ByVal</span> e <span class="TOKEN">As</span> System.EventArgs) Handles Fill_Dataset_ueberladen.Click
&nbsp;
strSql = &quot;SELECT CustomerID,CompanyName FROM Customers&quot;
<span class="TOKEN">Dim</span> DaAd = <span class="TOKEN">New</span> OleDbDataAdapter(strSql, cn)
<span class="TOKEN">Dim</span> ds <span class="TOKEN">As</span> <span class="TOKEN">New</span> DataSet
<span class="TOKEN">Dim</span> custrow <span class="TOKEN">As</span> DataRow
&nbsp;
Try
DaAd.fill(ds, m_next, 20, &quot;Customers&quot;)
<span class="TOKEN">Dim</span> dt <span class="TOKEN">As</span> DataTable = ds.Tables.Item(&quot;Customers&quot;)
ListBox1.Items.Clear()
m_next += 20 <span class="REM">'///////////////// die n&auml;chsten 20 deklariert als Private im Kopf</span>
<span class="TOKEN">For</span> <span class="TOKEN">Each</span> custrow <span class="TOKEN">In</span> dt.Rows
ListBox1.Items.Add(custrow.Item(&quot;Companyname&quot;) &amp; &quot; &quot; &amp; custrow.Item(&quot;CustomerID&quot;))
<span class="TOKEN">Next</span>
cn.Close()
MsgBox(&quot;geladen&quot;)
Catch ex <span class="TOKEN">As</span> Exception
MessageBox.Show(ex.ToString())
<span class="TOKEN">End</span> Try
&nbsp;
<span class="TOKEN">End</span> <span class="TOKEN">Sub</span></pre></div>
Code eingefügt mit dem MOF Code Converter (http://www.ms-office-forum.net/forum/codeconverter.php)

peterpan
09.03.2004, 07:21
Vielen Dank für Deine Antwort und das Beispiel. Eine Frage stellt sich da nur für mich... Wenn Du das DataSet jedesmal neu füllst, dann verlierst Du doch die alten Einträge in dem DataSet. Wenn ich aber nun noch auf die alten Einträge zugreifen möchte, so sind diese nicht mehr vorhanden. Oder hängt er die neuen einfach nur dran?

TykaAndreas
09.03.2004, 15:37
sie sind dann wieder weg,
wenn es auch rückwärts gehen soll , sezt eine weiteren button darunter den code aber "next -=20 "

irgendwie machst Du dir da ein Problem das keins is, kommt mir ein bischen so vor.
Ob es sinn macht ein Millionen in ein Dataset zu laden - ist doch eine philosophische Frage

Der mittelpunkt steht das offline arbeiten mit den Daten. Ob geänderte Daten im Dataset, auf den Server zurückgeschrieben werden können, ist eine Frage die das Dataset nicht betrifft . Das muss durch entsprechende SQl Strings bestimmt werden, (interpretiere dein Fage halt so ,bez. Aktuell)
Wenn es sich nur um eine Tabelle handelt kannst Du einen Commanbuilder verwenden

peterpan
09.03.2004, 16:06
Danke nochmal. Das mit dem Problem wo keines ist stimmt wohl. Ich hatte glaube ich den Ansatz von DataSets anfangs nicht richtig verstanden. Nun sehe ich aber klarer... :rolleyes:

peterpan
10.03.2004, 07:11
Aber eine Frage tut sich mir jetzt grade noch auf...

Wenn ich nun zwei grosse Tabelle hätte, die über einen Schlüssel miteinander verbunden sind abrufen möchte, so kann ich das doch sinnvoll nur über einen Join machen. Wenn ich den Ansatz von DataSets und DataAdapter aber richtig verstanden habe, gibt das dann Probleme beim Speichern, da der Adapter so keine Command erzeugen kann.

Der Lösungsweg für den Adapter wäre, beide Tabellen in das DataSet zu laden und dann eine Relation herzustellen. Dazu müsste ich dann aber doch entweder beide Tabellen komplett in den Speicher laden oder die beiden Teilbereiche der Tabelle mit 2 Joins auf der Datenbank selektiere, was ja für die Datenbankperformance ziemlich schlecht wäre.

Hakt es jetzt schon wieder bei mir oder ist das in der Tat ein Problem?