MOVE für ACCESS-Datenbank wie bei VB6

  • VB.NET

Es gibt 9 Antworten in diesem Thema. Der letzte Beitrag () ist von mepema2.

    MOVE für ACCESS-Datenbank wie bei VB6

    Hallo,

    mit dem alten VB6 konnte man mit rs.movefirst /next etc zwischen den einzelnen Datensätzen einer Tabelle navigieren.
    Gibt es sowas oder ähnliches auch bei VB2008 oder nur die Möglichkeit mit DataTable?

    VB.NET-Quellcode

    1. con.ConnectionString = _
    2. "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:\xxxx.accdb"
    3. cmd.Connection = con
    4. cmd.CommandText = "select * from Adressen"
    5. con.open
    6. 'Hier z.B. die Möglichkeit, einen Datensatz direkt anzusprechen oder in den Datensätzen zu blättern
    7. con.close

    Ich wollte nicht alle Datensätze einlesen, um dann darin zu blättern.

    Vielen Dank :)
    Na ja, sagen wir mal so, ich brauchte die Tabelle nicht in ein DataTable o.ä. laden sondern konnte gezielt auf einzelne Felder einer Tabelle zugreifen, also z.b. Feld "Name" im Recordset 233. Da war kein DataReader notwendig, der die gesamte Tabelle eingelesen hat. Mit myrs.move (233) konnte der Datensatz 233 direkt angesprungen werden. Ging nur, solange die Verbindung zu Datenbank (mdb) bestand.

    mepema2 schrieb:

    Ging nur, solange die Verbindung zu Datenbank (mdb) bestand.
    ah - dann hatter da wohl nachgeladen. Wobei ich mich frage, woher die DB wissen soll, was wohl der 233. Datensatz eines RecordSets sein mag.

    Seisdrum: Ado.Net ist so designed, dass stehende Verbindungen vermieden werden sollen.
    Was macht wohl der Befehl rs.open ?

    Er öffnet den gesamten Recordset und dieser liegt dann komplett im Arbeitspeicher.

    Ausserdem ist es auch die Frage ob der Zugriff über DAO oder über ADO erfolgt ist.

    Bei .Net wird meistens ADO.Net verwendet.
    NB. Es ist doch schön, wenn man lesbare Namen vergibt. Siehe auch [VB.NET] Beispiele für guten und schlechten Code (Stil).
    @ INOPIAE: Also, der Zugriff erfolgt mittels DAO 3.6. Und

    VB.NET-Quellcode

    1. myRS.MoveNext
    2. TotalRec.Caption = myRS.RecordCount
    etc gehen nicht, wenn keine aktive Verbindung zu DB besteht. Aber ob das nun im Arbeitsspeicher liegt oder nicht ist auch nebensächlich.

    Aber darum geht es auch gar nicht! Denn in VB6 funktioniert alles. Es geht darum, in VB2008 alles neu zu schreiben und ein neues Konzept für mein Programm zu entwickeln.

    Um die ursprüngliche Frage etwas einfacher zu formulieren:
    Ich habe eine Adressentabelle innerhalb einer Datenbank (*.accdb => ACCESS 2010).
    Sagen wir mal 50 Datensätze mit je 30 Einträgen/Feldern. Diese möchte ich nicht als Tabelle angezeigt bekommen (wäre eine breite Tabelle) sondern jeden Datensatz einzeln; von einem zum anderen blättern.
    Nun könnte ich natürlich mit reader.read die Tabelle durchlaufen lassen und die Kundennummern in einem Array speichern. Damit bestünde die Möglichkeit, jeden Datensatz direkt anzusprechen.

    Aber, und das ist meine Frage (da es scheinbar MOVE nicht gibt), ist das der richtige und sinnvollste Weg?

    Vielen Dank für konstruktive Antworten ;)
    in Ado.Net lädt man die ganze Tabelle.
    Allerdings murkelt man sich nicht mit einem Reader und einer Array-Befüll-Schleife ab, sondern lässt einen DataAdapter das Zeug in eine DataTable laden.

    Niemand zwingt dich, die komplette Tabelle anzuzeigen, aber die Daten sind schonmal für alle mögliche weitere Verarbeitung verfügbar.

    gugge "Datenbank in 10 Minuten" auf Movie-Tuts (allerdings zeigt das gleich 2 Tabellen in Abhängigkeit)

    Ich empfehle, zunächstmal ohne DB zu entwickeln, denn die Haupt-Schwierigkeit wird sein, sich in Databinding-getriebenes Entwickeln einzudenken: DB-Programmierung ohne Datenbank

    Vorgänge wie Blättern, Filtern, Sortieren sind alle bereits in die DataTable eingebaut - dafür ist keine Zeile Code mehr zu schreiben.
    Es lohnt sich, sich mit vier Views auseinanderzusetzen: ganz allgemeine Prinzipien der Präsentation von Daten.
    "Blättern" einzelner Datensätze etwa ist eine verkrüppelte Form des DetailViews - sollteman imo niemandem mehr zumuten.

    INOPIAE schrieb:

    Was macht wohl der Befehl rs.open ?
    Er öffnet den gesamten Recordset und dieser liegt dann komplett im Arbeitspeicher.
    Er öffnet das Recordset und liest erst mal eine Handvoll Records.
    Erst ein RS.Movexxxx bringt das Recordset zum Nachladen der nächsten Daten.
    Je nach Cursortyp wird das Recordset sogar von Anfang an neu berechnet.

    Man muss beachten, dass eine "richtige" Datenbank von vielen Usern gleichzeitig verwendet wird.
    Deshalb würde es gar keinen Sinn machen ein Recordset einmal statisch einzulesen, da bis zur Verarbeitung des nächsten Record der Datenbestand schon wieder vollkommen anders aussehen kann.

    Die meisten User im Forum werden zwar nie mit einer hochdynamischen Multiuser-Umgebung in Kontakt kommen, aber bei der Definition des ADO-Standards wurde durchaus auch daran gedacht.
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    @petaod: So habe ich die Arbeit der rs.Move (xxx)-Anweisungen auch verstanden und erlebt. Die Anweisung rs.Move (xxx) ist meiner Erfahrung nach relativ und bezieht sich immer auf den aktuellen Recordset. Wenn ich also bei Recordset 10 bin und und schreibe rs.Move (30) dann geht der Zeiger auf Recordset 40, nicht auf 30. Andernfalls mußte ich immer mit rs.MoveFirst zum Tabellenanfang gehen und dann mit rs.Move (30) auf Recordset 30.