Announcement

Collapse
No announcement yet.

Scrollen durch Datenmenge

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Scrollen durch Datenmenge

    Hallo,

    ich habe mir über einen BdpDataAdapter Daten aus einer SQL Datenbank beschafft und diese Daten einem Dataset zugewiesen.
    Wie kann ich nun über Programm auf die einzelnen Datenzeilen zugreifen. Gibt es Funktionen wie First, Next, Last, ... . Wie kann ich auf die einzelnen Feldinhalte über Programm zugreifen ?

    Gruß Georg

  • #2
    Hallo,

    das DataSet aus dem .NET Framework arbeitet mengenorientiert, so das es auf diese Frage sehr viele Antworten gibt ;-)

    > Gibt es Funktionen wie First, Next, Last,...

    Das Konzept eines "aktuellen Datensatzes" gibt es beim DataSet nicht mehr, da man dort <b>gleichzeitig</b> auf <br>
    a) einen, oder <br>
    b) mehrere, oder <br>
    c) alle <br>
    Datensätze zugreifen kann. Wenn man ein Gegenstück zum <i>TDBNavigator</i> früherer Delphi-Versionen sucht, führt der <b>CurrencyManager</b> zum Ziel.

    Das folgende Beispiel rüstet eine Anzeige der sichtbaren "Datensatznummer" und der Anzahl der Datensätze in der Statusbar nach: <br>
    1. Variable für den CurrencyManager des Formulars deklarieren <br>
    2. Aktuelle CurrencyManager-Objektinstanz abfordern und in der Variable ablegen<br>
    3. CurrencyManager-Eigenschaften Position und Count auswerten<br>
    4. Ergebnis in der StatusBar anzeigen
    <pre>
    <b>type</b>
    TWinForm = <b>class</b>(System.Windows.Forms.Form)
    <font color="#003399"><i>{$REGION 'Designer Managed Code'}</i></font>
    ...
    <font color="#003399"><i>{$ENDREGION}</i></font>
    strict <b>protected</b>
    <b>procedure</b> Dispose(Disposing: Boolean); <b>override</b>;
    <b>private</b>
    <font color="#003399"><i>{ Private Declarations }</i></font>
    FCM : CurrencyManager;
    <b>procedure</b> DoRefreshStatusBar;
    <b>public</b>
    <b>constructor</b> Create;
    <b>end</b>;
    </pre>
    Implementierung:
    <pre>
    <b>procedure</b> TWinForm.ButtonFill_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>begin</b>
    BdpDataAdapter1.SelectCommand.Parameters[0].Value := TObject(10);
    BdpDataAdapter1.Fill(dataSet1, <font color="#9933CC">'MailAdressen'</font>);
    FCM := BindingContext[dataSet1, <font color="#9933CC">'MailAdressen'</font>] <b>as</b> CurrencyManager;
    DoRefreshStatusBar
    <b>end</b>;
    <br>
    <b>procedure</b> TWinForm.DoRefreshStatusBar;
    <b>begin</b>
    StatusBar1.Text := System.<b>String</b>.Format(<font color="#9933CC">'Datensatz {0} von {1}'</font>,
    TObject(FCM.Position + 1).ToString, FCM.Count.ToString);
    <b>end</b>;
    </pre>
    Die Position des "virtuellen Datensatzzeigers" wird geändert, indem die Eigenschaft <b>Position</b> beschrieben wird:
    <pre>
    <b>procedure</b> TWinForm.ButtonPreviews_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>begin</b>
    FCM.Position := FCM.Position - 1;
    <b>end</b>;
    <br>
    <b>procedure</b> TWinForm.ButtonNext_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>begin</b>
    FCM.Position := FCM.Position + 1;
    <b>end</b>;
    </pre>
    &gt;Wie kann ich auf die einzelnen Feldinhalte über Programm zugreifen ?

    Da ein DataSet beliebig viele Tabellen (DataTable-Instanzen) speichern kann, führt der Weg über die DataTable-Instanz im DataSet. Jede DataTable besteht ihrerseite aus einer Sammlung von DataRow-Objektinstanzen (siehe <b>Rows</b>-Kollektion), so dass man sich durch diesen "Objektbaum" durchhangeln kann:
    <pre>
    <b>procedure</b> TWinForm.Button1_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>var</b>
    sCustomerID : <b>String</b>;
    <b>begin</b>
    sCustomerID := DataSet1.Tables[0].Rows[0][0].ToString;
    MessageBox.Show(sCustomerID, <font color="#9933CC">'Die 1. Spalte des 1. Datenstatzes der 1. Tabelle im DataSet'</font>);
    <b>end</b>;
    </pre>
    Ein mengenorientierter Zugriff auf das DataSet könnte zum Beispiel so aussehen - ich suche dabei alle die Datensätze heraus, bei denen die Spalte <i>Fax</i> einen Wert enthält:
    <pre>
    <b>procedure</b> TWinForm.Button2_Click(sender: System.<b>Object</b>; e: System.EventArgs);
    <b>var</b>
    aRA : <b>array</b> <b>of</b> DataRow;
    i : Integer;
    <b>begin</b>
    aRA := DataSet1.Tables[0].Select(<font color="#9933CC">'Fax IS NOT NULL'</font>);
    <b>for</b> i := Low(aRA) <b>to</b> High(aRA) <b>do</b>
    <b>begin</b>
    MessageBox.Show(aRA[i][0].ToString, i.ToString);
    <b>end</b>;
    <b>end</b>;
    </pre>
    &#10

    Comment

    Working...
    X