Recordset Auswertung

Ignus

Mitglied
Hallo ihr,

ich habe ein Recordset mit einer Tabelle aus einer MySQL-Datenbank gefüllt und möchte dieses nun auswerten, ohne vorher zu wissen wie groß oder welcher Inhalt das Recordset hat. Ich möchte es mir faktisch irgendwie Tabellarisch anzeigen lassen.
Da ich in dieser Sache (auch generell) ein ziemlicher Neuling in Sachen VB.NET programmierung bin, schlag ich mich jetzt schon ne ziemliche weile (ca. 1woche) damit rum. *seufts*

Ich habe schon ziemlich viele Hilfen durchforstet und sowieso schon lange den Überblick verloren, so weis ich nun immer noch nicht wie ich aus dem Recordset Spaltenbezeichnung(Header einer Spalte) oder Zusatzinformationen wie Datentyp der Spalte oder ähnliches herausbekomme. (Recordcount gibt mir zwar die Zeilenanzahl an, finde ich aber noch zu dürftig)
'tbInhalt.Text = rs.GetString' von einem Recordset ist ja nicht so das wahre...die Header fehlen und die Formatierung ist sowieso unschön.

Mit einem DataGridView habe ich bisher ebenfalls nichts hinbekommen können. Bei dem Ding blicke ich schlicht und einfach nicht durch, wie ich da Daten aus einem Recordset reinbekommen soll. (Brauche ich dafür ein DataSet? oder geht das Recordset auch direkt in ein DataGridView?)
Wie in der Hilfe beschrieben geht dat bei mir irgendwie nicht, da wird nichts angezeigt:
Code:
' Set up the DataGridView.
        With Me.DataGridView1
            ' Automatically generate the DataGridView columns.
            .AutoGenerateColumns = True

            ' Set up the data source.
            .DataSource = rs.DataSource


            ' Automatically resize the visible rows.
            .AutoSizeRowsMode = _
                DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders

            ' Set the DataGridView control's border.
            .BorderStyle = BorderStyle.Fixed3D

            ' Put the cells in edit mode when user enters them.
            .EditMode = DataGridViewEditMode.EditOnEnter
        End With


Ein DataSet mit dem RecordSet zu füllen hab ich auch noch nicht hinbekommen, da ich scheinbar keinen OleDbDataAdapter habe!? um es zu füllen. Bzw. wofür ist das Ding eigendlich gut wenn man schon ein Recordset hat?
 
Zuletzt bearbeitet:

JensG

Erfahrenes Mitglied
Hallo Ignus,

in .NET sollte man auch ADO.NET verwenden und nicht ADO.
Desweiteren gibt es in ADO.NET keine Recordsets mehr.

Ein DataGrid oder DataGridView kann über ein DataSet, DataView oder DataTable gebunden werden, nicht aber ein ADODB.Recordset.
Um einen ADODB.Recordset in ein DataSet zu zwängen gibt es
die OleDbDataAdapter.Fill Methode. Das ist aber ein Notnagel.

Setze Dich grundlegend mit ADO.NET auseinander.
Die (Online) Hilfe enthält dazu diverse Grundlagenartikel unter
http://msdn2.microsoft.com/de-de/library/e80y5yhx.aspx
"ADO.NET".

Jens
 

Ignus

Mitglied
Also sind ADODB.RecordSet und .DataSet von ADO das selbe nur beides unterschiedliche Systeme. Das erklärt einiges, war aber bist zu deinem Post aus den Hilfen nicht gerade ersichtlich. Mal schauen ob ichs jetzt hinbekomme.
Hoffentlich kann ich mit ADO.Net auch so einfach auf eine MySql Datenbank zugreifen.

Vielen Dank für deine Antwort. :)
 

Nico Graichen

Erfahrenes Mitglied
Hi,

Das geht mit MySQL genauso einfach wie mit jedem anderen DBMS auch. Vorausgesetzt, du vergisst nicht den MySQL-DataAdapter zu installieren ;)
 

JensG

Erfahrenes Mitglied
Hallo Ignus,

bei MySQL empfehle ich dir den offiziellen .NET Connector zu benutzen.
Den kannst du bei mysql.com herunterladen.
In deinem Programm musst du dann die mysql.data.dll als Verweis einbinden.
Die letzte Version ist glaub ich 1.07.

Jens
 

Ignus

Mitglied
Vielen Dank für eure Hilfen bisher.
Ja genau den hatte ich schon zuvor installiert nach einigem Forenstöbern, sonst hätte ich ja das Recordset garnicht füllen können oder? Egal. Ich verlass mich mal voll auf Profies Aussagen und mach das jetzt nur noch mit dem ADO.NET. Das scheint mir jetzt am besten geeignet, denn falls man extra Wünsche hat auch mit anderen Datenbankentypen kann man scheinbar recht uneingeschränkt agieren.
Aber auf mich sollte man eigendlich nicht hören :p - dafür hab ich noch zu wenig Erfahrung/Kenntnisse.

Ok, hier ist nun der funktionierende Code womit ich auf eine MySql-Datenbank connecte und den Select im DataGridView anzeigen lasse über eine gespeiste DataTable:
Code:
Imports MySql.Data.MySqlClient

Public Class Form1

    Private Sub btnConnect_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnConnect.Click


        'Definition der Zugangsdaten:
        Dim myServer As String = tbServer.Text
        Dim myUser As String = tbUser.Text
        Dim myPasswort As String = tbPasswort.Text
        Dim myDatenbank As String = tbDatenbank.Text
        Dim myTabelle As String = tbTabelle.Text
        Dim mySelect As String = "SELECT * FROM " & tbTabelle.Text

        'Treiberkommandos:
        Dim conn As MySqlConnection
        Dim myDatas As DataTable
        Dim dataAdapter As MySqlDataAdapter

        'Verbindung:
        conn = New MySqlConnection("Database=" & tbDatenbank.Text & ";Data Source=" & tbServer.Text & ";User Id=" & tbUser.Text & ";Password=" & tbPasswort.Text & ";")
        conn.Open()

        'Verbindungsstatus:
        'tbStatus.Text = conn.State.ToString()
        If conn.State = ConnectionState.Open Then
            tbStatus.Text = "Verbindung zum Server war erfolgreich."
        Else : tbStatus.Text = "Verbindung zum Server war NICHT erfolgreich."
        End If

        'Einlesen der Daten in eine DataTable:       
        dataAdapter = New MySqlDataAdapter(mySelect, conn)
        myDatas = New DataTable
        dataAdapter.Fill(myDatas)


        'übergeben der Daten an ein DataGridView:
        With Me.DataGridView1
            ' Automatically generate the DataGridView columns.
            .AutoGenerateColumns = True

            ' Set up the data source.
            .DataSource = myDatas

            ' Automatically resize the visible rows.
            .AutoSizeRowsMode = _
                DataGridViewAutoSizeRowsMode.DisplayedCellsExceptHeaders

            ' Set the DataGridView control's border.
            .BorderStyle = BorderStyle.Fixed3D

            ' Put the cells in edit mode when user enters them.
            .EditMode = DataGridViewEditMode.EditOnEnter
        End With

        conn.Close()


    End Sub
Verwendete Verweise:
Microsoft ADO Ext. 2.8 for DDL and Security
Microsoft ActiveX Data Objects 2.8 Library
MySql.Data.dll
System.Data

Hab da noch was *g*
Ich habe ja verschiedenste Möglichkeiten mir mit ADO.NET Daten von einer Datenbank einzulesen und zwischen zu speichern. Mit dem Reader, dem DataSet, der DataTable und wahrscheinlich gibts noch irgend etwas was ich noch nicht gefunden habe. Da ich momentan noch nicht so recht den Überblick aller habe, wollte ich wissen was davon die beste/einfachste Möglichkeit ist, um zwischengespeicherten Daten zu handeln, umzusortieren oder weitere Infos aus einer Tabelle zu ziehen, wie Datenformat oder Tabelleneigenschaften?
 
Zuletzt bearbeitet:

JensG

Erfahrenes Mitglied
Hallo Ignus,

Ignus hat gesagt.:
Ja genau den hatte ich schon zuvor installiert nach einigem Forenstöbern, sonst hätte ich ja das Recordset garnicht füllen können oder? Egal.

nee, nicht egal :)

Ignus , ein Recordset gibt es gar nicht mehr unter ADO.NET und die MySql.Data.dll
ist für ADO.NET entwickelt wurden.
Du musst umdenken unter ADO.NET. Es gibt hier keine Recordsets mehr. Vergleichbar
wäre der DataReader in ADO.NET. Er ist verdammt schnell aber kann nur vorwärts lesen.

Ignus hat gesagt.:
Verwendete Verweise:
Microsoft ADO Ext. 2.8 for DDL and Security
Microsoft ActiveX Data Objects 2.8 Library
MySql.Data.dll
System.Data

Die Verweise
Microsoft ADO Ext. 2.8 for DDL and Security
Microsoft ActiveX Data Objects 2.8 Library
brauchst du in deinem Code gar nicht mehr.

Ignus hat gesagt.:
Hab da noch was *g*
Ich habe ja verschiedenste Möglichkeiten mir mit ADO.NET Daten von einer Datenbank einzulesen und zwischen zu speichern. Mit dem Reader, dem DataSet, der DataTable und wahrscheinlich gibts noch irgend etwas was ich noch nicht gefunden habe. Da ich momentan noch nicht so recht den Überblick aller habe, wollte ich wissen was davon die beste/einfachste Möglichkeit ist, um zwischengespeicherten Daten zu handeln, umzusortieren oder weitere Infos aus einer Tabelle zu ziehen, wie Datenformat oder Tabelleneigenschaften ?

Es kommt darauf an was man machen will. Willst du die Daten nur schnell lesen
dann ist der Reader das beste.
Hast du nur eine Tabelle dann füllst du ein DataTable.
Hast du Relationen mit mehreren Tabellen dann brauchst du ein DataSet.
Ein DataSet ist ein riesiger Puffer der ganze Datenbanken abbilden kann und das
im Offline Betrieb. D.h. ADO.NET ist eigentlich darauf ausgelegt um Netzlast zu
verringern in dem alle Änderungen erst in einem DataSet übernommen werden und später
zum richtigen Zeitpunkt per Adapter an die richtige DB übergeben werden.
Beschäftige mal ne Weile damit und hole dir ein gutes Buch oder Beispiele aus dem
Netz.

Gruß
Jens
 

Ignus

Mitglied
Danke für die Info, langsam wird die ganze Sache in meinem Kopf klarer. Also ist ein Dataset einer Accessdb sehr ähnlich und faktisch eine virtuelle Datenbank.
Und mein Recordset habe ich füllen können, also irgendwas muss da funktioniert haben *g*

Ja was ich brauch ist eigendlich genau so ein DataSet. Ich müsste eben ziemlich viele (bis zu 10.000) und manchmal nur wenige Datensätze auslesen aus einer Accessdb und es nach Oracle 10.irgendwas zeitgesteuert senden können oder auch umgekehrt. Die MySQL-db dient hierbei nur zum Testen, weil es ja eigendlich egal ist woher man seine Datenbank bekommt. Eine Schattenkopie des ganzen geht nicht, weil es nicht alle Daten sein sollen und die Oracledb bei mir Bezeichnungsnomenklaturen hat, die man möglichst einhalten sollte. Ich weis nocht nicht genau wie ichs am besten mache. Dazu würde ich mir im Programm Benutzerprofile reinmachen, welche ebenfalls über ein DataSet erreichbar wären.

Dazu hätte ich aber schon wieder mal wieder ne Frage ^^
Ein DataSet wird ja im Arbeitsspeicher reserviert. Bisher habe ich nirgends lesen können, inwiefern es nach beenden des Programmes oder überhaupt wenn es nicht mehr benötigt wird, wieder aus dem Arbeitsspeicher entfernt wird. Weil so ein Ding kann ja schon ziemlich gross werden, wenn man damit komplette DBs einlesen kann.
Wenn es manuell geht wärs eine feine Sache, so würde man sich den Arbeitsspeicher nicht so zumüllen wärend das Programm läuft.

Das weiter Ding ist, dass man das DataSet scheinbar auf die schnelle nur als XML-Datei abspeichern kann.. ebenfalls sehr zum Leid der Dateigrösse. An dieser Stelle muss ich es wahrscheinlich umständlich machen und mit dem DataSet eine eigene Accessdb oder sowas speisen, in der dann nur Benutzerprofile von dem Programm abgelegt werden. Ausser es hat einer ne bessere Möglichkeit wie man ein DataSet abspeichern kann *g*
 
Zuletzt bearbeitet:

Ignus

Mitglied
Ok ich Dummi,
mit .Clear geht das natürlich - sorry.

Womit ich aber noch unzufrieden bin ist dieses WriteXml. Nehmen wir mal an ich hab 100 Datensätze. Speicher ichs nu ab, hat die Datei mal eben mehr als das Dreifache seiner notwendigen Grösse. Faktisch braucht ein Wort damit 3x soviel Speicherplatz.
Und ich nehme mal an um ein DataSet anders abzuspeichern ist die einzigste Möglichkeit, jedes fitzelchen aus dem DataSet auszulesen und nacheinander in eine Datei als String zu ballern oder gehts auch einfacher?