OleDbDataReader alles auf mal auslesen.

  • C#
  • .NET (FX) 4.0

Es gibt 12 Antworten in diesem Thema. Der letzte Beitrag () ist von ErfinderDesRades.

    OleDbDataReader alles auf mal auslesen.

    Moin,
    in C# kann man mit

    C#-Quellcode

    1. OleDbCommand cmd = new OleDbCommand();
    2. OleDbConnection cn = new OleDbConnection();
    3. OleDbDataReader dr;


    z.b. eine Tabelle in Access Auslesen
    Mit

    C#-Quellcode

    1. dr.read();
    2. dr[0].toString();
    3. dr["Test"].toString();


    könnte man diese Ausgaben. Zeile für Zeile... immer wieder mit dr.read(); eine Zeile weiter.

    Kann ich auch einfach das gesamte Ergebnis in ein Array speichern ohne eine schleife zu nutzen um alles dort einzulesen? Kurz: gibt OleDbDataReader eine Variable zurück, in der einfach alles gespeichert ist und wenn ja, was ist das für eine Variable und wie gebe ich diese aus?
    @Pardasus Warum liest Du denn nicht die ganze Tabelle in ein DataSet ein?
    Hier als Excel, da musst Du nur den ConnectionString anpassen.
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Private Sub LoadExcelFile(path As String, table As String) ' Pfad und Tabelle
    2. Try
    3. Dim DtSet = New DataSet
    4. Dim connString As String
    5. Dim fi = New IO.FileInfo(path)
    6. Me.Text = fi.Name
    7. If path.ToLower.EndsWith(".xlsx") Then
    8. 'connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=Excel 12.0;"
    9. connString = "Provider=Microsoft.ACE.OLEDB.12.0; Data Source=" & path & "; Extended Properties=""Excel 12.0 Xml; HDR=YES; IMEX=1"";"
    10. Else
    11. connString = "provider=Microsoft.Jet.OLEDB.4.0; data source=" & path & "; Extended Properties=Excel 8.0;"
    12. End If
    13. Using myConnection = New OleDb.OleDbConnection(connString)
    14. Dim myCommand As OleDb.OleDbDataAdapter
    15. myCommand = New OleDb.OleDbDataAdapter("select * from [" & table & "$]", myConnection)
    16. myCommand.TableMappings.Add("Table", "TestTable")
    17. myCommand.Fill(DtSet)
    18. Me.DataGridView1.DataSource = DtSet.Tables(0)
    19. myConnection.Close()
    20. End Using
    21. Catch ex As Exception
    22. MessageBox.Show(ex.Message)
    23. End Try
    24. End Sub
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!
    Das mit dem DataSet habe ich auch schon oft gelesen, aber einfach nicht verstanden, wie ich damit auf einzelne Spalten zugreifen kann.

    Wenn ich mit "SELECT ...." mir die Daten in das DataSet geladen habe, wie kann ich dann z.b. sagen "label.text = dr["Vorname"].toString();"

    Im Internet sind viele Beispiele, aber die drehen sich alle immer nur um das einlesen, aber kein sagte wie ich damit auf einzelne Spalten/Zeilen gezielt zugreifen kann.
    Machste dann mit'm databinding in winforms mehr oder weniger automatisch.

    Zieh eh doch mal im vs die Access dB über datenquellen i dein Projekt, dann wirds ds automatisch erstellt und über die tableadapter mit .fill verfüllt.

    Dann einfach ach eindgv aufm dataset aufs form ziehen
    Gruß Hannes
    Wenn Du die Daten in einem DataSet bzw. in einer DataTable hast, kannst Du mit einer For-Each-Schleife über alle Zeilen der DataTable laufen oder Du wählst mit der Find- bzw. Select-Methode eine oder mehrere Zeilen aus.

    Der Zugriff innerhalb der Zeile erfolgt dann meist nach dem Muster:

    Dim KundenName as String

    For Each rowKunde im tblKunden.Rows

    KundenName = rowKunde("SpaltennameFuerDenKundennamen").ToString

    Next

    Pardasus schrieb:

    Wenn ich mit "SELECT ...." mir die Daten in das DataSet geladen habe, wie kann ich dann z.b. sagen "label.text = dr["Vorname"].ToString();"
    Komische Frage - weil du sagst die Antwort doch selbst. Es geht so:

    C#-Quellcode

    1. label.text = dr["Vorname"].toString();
    Vorausgesetzt dr ist eine der DataRows, die du geladen hast.
    Empfehlen würde ich so ein Vorgehen aber nicht - VisualStudio und Framework halten eine viel gewaltigere Unterstützung zur Datenverarbeitung bereit.
    Mmmh... das war jetzt doch etwas zu einfach ;) dann werde ich mich mal weiter mit den DataSet beschäftigen.

    Hatte mir da was selbst gebastet was bestimmt nicht Ideal ist, aber ein gutes Training für ein Anfänger war.

    Habe eine ganz einfach Objekt erstellt was ich mit einem Konstruktor befüllen kann und in einer List<> sammel.
    Hier mal die Kurzfassung... (geht noch mehr ins Detail, aber diese Beispiel erklärt gut wie ich es bis jetzt gelöst habe.)

    C#-Quellcode

    1. List<Kundendaten> Kunden = new List<Kundendaten>();
    2. cn.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + Dateisystem.Datenbank;
    3. cmd.CommandText = "SELECT * FROM Kunden";
    4. dr = cmd.ExecuteReader();
    5. while(dr.Read())
    6. {
    7. Filialen.Add(new Kundendaten(dr["Vorname"].ToString(), dr["Nachname"].ToString()));
    8. }
    9. drFilialen.Close();
    10. cnFilialen.Close();


    Hier die Klasse dazu

    C#-Quellcode

    1. class Kundendaten
    2. {
    3. public Kundendaten(string Vorname, string Nachname)
    4. {
    5. _Vorname = Vorname;
    6. _Nachname = Nachname;
    7. }
    8. public string _Vorname { get; set; }
    9. public string _Nachame { get; set; }
    10. }
    Ja, das ist auf eine Art der naive Ansatz, und da codest du dich dumm und dämlich, wenn du zB eine Db hast, mit auch nur 5 Tabellen.
    Weil für jede Tabelle musste das coden, und für jede Tabelle nicht nur das SelectCommand, sondern auch Delete, Update und Insert, und letztere beiden sind noch viel aufwändiger.
    Ausserdem codest du bislang nur mit Strings, inne Realität kommen aber noch andere Datentypen vor, und da wirst du dann auch alle Fehler, dies gibt, durchdeklinieren - das ist sehr absehbar.

    Und was am Ende bei rauskommt hat immer noch keine Änderungsverfolgung, und kann auch keine relationalen Datenmodelle abbilden.

    Ich rate sehr ab von selbstgebastelten DatenObjekten.

    Ich rate überhaupt ab von Datenbank, solange du nicht absolut sattelfest bist, was Datenmodellierung und Databinding angeht.
    Sogar dann rate ich noch von Datenbank ab, sondern code erstmal dein Projekt fertig - das geht nämlich auch ohne Datenbank, und zwar viel einfacher.
    Nachträglich eine Db zu hinterlegen, bei einer bereits funktionierenden DatasetOnly-Anwendung ist nämlich vergleichsweise eine Kleinigkeit.

    Aber eine Anwendung überhaupt zu entwickeln, wenn das Datenmodell nicht aufgeht, ist schlicht unmöglich!

    Also zäume das Pferd richtig rum auf, und erlerne erstmal überhaupt was eine relationale Datenverarbeitung ausmacht: codeproject.com/Articles/1030969/Relational-Datamodel
    Dann lies auch die Folge-Artikel davon, und erlerne, was Databinding ist, und wie man es nutzt.

    Dann schreib deine Anwendung, und schreib sie fertig.

    Erst danach hats überhaupt Sinn, eine dazu passende Datenbank aufzusetzen, und sich mit Db-Zugriffen zu beschäftigen - vorher nicht!
    Ist nicht nur Zeitverschwendung (denn am Ende gehts doch komplett anders), sondern du gewöhnst dir wurstelnder Weise auch ungefähr alle Anti-Pattern an, die's in dem Bereich überhaupt gibt.
    Und mit angewöhnten Anti-Pattern stehst du dir nur selbst im Weg, weil du ja nicht ahnen kannst, dasses eigentlich viel viel einfacher ginge.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von „ErfinderDesRades“ ()

    Danke für deine Tipps aber mein Programm lebt von der Datenbank ;) sie weg zu lassen macht das Programm sinnlos.

    Ich verdiene damit kein Geld, sonder macht das in Moment nur als Hobby. Hab also kein Stress und taste mich da langsam ran.
    Jeder fängt irgendwann mal an und ich versuche mich gerade daran zu verstehen, wie man mit C# (VisualStudio) sich mit einer Access Datenbank "unterhalten" kann.

    Ich hatte mich schon mal mit DataSets beschäftigt, habe sie aber irgendwie nicht verstanden. Also habe ich den weg über SQL befehle verfolgt. Der Funktioniert zwar, aber ich habe schnell gemerkt das diese sehr suboptimal ist.
    Wie du schon sagtes, es wird sehr schnell unübersichtlich. Aber mir ging es hierbei auch nur, etwas zu verstehen. Dabei habe ich als positiven neben Effekt die Möglichkeiten von List<> und Threads verstanden.

    Kurz: ich Code so vor mich her und versuche die Möglichkeiten zu Kombinieren und mein wissen zu vertiefen.

    Jetzt noch mal zum DataSet, die machen mich immer noch verrückt. 2 Std. Google ich schon. Habe viel gelesen und Videos geschaut. Das Problem ist, alle zeigen wie man die Daten in ein DataGrid ausgibt, das hilft mir nur nicht.

    Hier hänge ich gerade fest:

    C#-Quellcode

    1. label.text = testDataSet.Daten[0].Vorname;​

    Sagt immer, das es in der Zeile nix gibt (Daten[1] auch nicht). VisualStudio zeigt mir im Designer (Vorschau) aber Daten an.
    Habe das Gefühl das mir ein Befehl noch fehlt...

    p.s.: ich habe die Datenbank (Access) mit VisualSudio eingebunden und der Fehler taucht erst beim Ausführen des Programmes auf.

    Pardasus schrieb:

    Danke für deine Tipps aber mein Programm lebt von der Datenbank sie weg zu lassen macht das Programm sinnlos.
    Wie gesagt: Entwickeln kannst du das Proggi mit Sicherheit einfacher ohne Datenbank.
    Wenns dann soweit fertig ist, kannst du immer noch eine Db hinterlegen.

    Nach Dataset googeln bringt nicht viel, ca. 70% der Autoren haben keine Ahnung vom TypDataset, viel wird auch zum untypisierten Dataset geschrieben, was man imo ühaupt nicht benutzen sollte. Und logisch kannst du da nicht entscheiden, welche Info was taugt, und welche nicht.
    Wie wärs eiglich, wenn du einfach mal das Tut durcharbeitest, was ich dir verlinkt habe?
    Würde dir evtl. viel herumgegoogle sparen, und bei Verständnisschwierigkeiten könnteste sogar nachfragen...

    zu deim Festhängen: Also von einer Fehlermeldung, die "sagt, dass es in der Zeile nix gibt", hab ich noch nie gehört. Bist du dir sicher, dass du die Fehlermeldung korrekt wiedergibst?
    Mein Programm liest ca. 400 (10-40kb große) Textdateien ein, Analysiert diese und speichert die gefilterten Informationen in die Accesss-Datenbank. Dieses macht es über 30 Tage, schaut ob die Daten bereits eingelesen wurden, ob Tage fehlen oder Informationen fehlen.
    Wenn bein Einlesen die Datenbank das Programm abstürzt (über Taskmanager beendet wird) kann es genau dort wieder ansetzten wo es war. Danach werden die Textdateien gelöscht.
    Wenn das Programm mehrfach gestartet wird, wartet es, bis das andere beendet wurde und fängt dann sofort da an weiter zu machen, wo das andere aufgehört hat. Diese geht sogar über mehrere Rechner in einem Netzwerk die auf die gleiche Accesss Datenbank zugreifen. Sollte sich das Programm aufhängen, bekommen das die anderen mit und geben dem Programm noch 60 Sek., danach übernimmt das nächste die Kontrolle.

    Das läuft alles komplett über die Access Datenbank. Es läuft 1a, nur ist eben der Code für´n Ar... ;) dieses Typisierte DataSet finde ich da schon sehr Sexy und möchte unbedingt heraus bekommen wie man damit Arbeitet.
    Gerade in Verbindung mit VisualStudio macht das DataSet ein echt tollen eindrucken (Wenn auch mehr Ressourcen gebraucht werden).

    Habe hier auch schon ein dickes Buch über den Aufbau von Datenbanken, aber noch nutzte ich das nicht Professional und möchte erst mal wissen wie ich grundsätzlich auf die Daten über VisualStudio zugreifen kann.

    Was mache ich
    - in VisualStudio binde ich die Access Datenbank ein unter Datenquellen.
    - Kann dort die Komplette Datenbank abrufen und auch abragen erstellen. Läuft 1a und alles ist da.
    - zurück in Form1 habe ich ein Label1 wo ich nur zum Testen die erste Spalte auf der ersten Zeile der DB ausgeben möchte.
    - über die Toolbox habe ich unter "Daten" das "DatenSet" in Form1 gezogen und eine Verbindung zur Datenbank hergestellt (KundenDBDataSet1).
    - dort steht in "Form1_Load" nur "label1.text = KundenDBDataSet1.KundenDaten[0].Vorname.ToString();".

    - beim Start kommt folgende Fehlermeldung (siehe Anhang.)

    Ich habe irgendwie das Gefühl, dass ich vergesse die Daten aus der Datenbank einzulesen?!?

    p.s.: danke für den Link! Ich kann zwar Englisch Lesen, aber auch nicht Perfekt. In Grund verstehe ich es oberflächlich. Werde mal versuchen mich dort einzulesen.
    Bilder
    • DataSetFehler.png

      33,88 kB, 478×405, 99 mal angesehen

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Pardasus“ ()

    naja, soweit würd ich nicht gehen.
    Diese großen Datenmengen zu verarbeiten - da muss man glaub schon bisserl nachdenken, ob man das iwie in Abschnitte unterteilt, dass nicht alle 400 Dateien auf einmal ins typDataset geladen sein müssen.

    Kann schon sein, dasses tatsächlich ein Kinderspiel ist. Etwa wenns möglich ist, Datei für Datei je zeilenweise zu lesen, auszuwerten, und wenn nur das "Filtrat" im Dataset unterzubringen ist - für sowas ist ein typDataset ebenfalls optimal.
    Aber das kommt halt ganz drauf an, was da nun tatsächlich zu passieren hat.

    Nochmal (ich hör dann auch auf damit, das ständig zu wiederholen, viele können/wollens halt nicht begreifen): Auch dieses kannst du einfacher entwickeln ohne Datenbank. Während der Entwicklungszeit brauchst du eh reproduzierbare Test-Daten, und auch dafür ist der DatasetOnly-Ansatz optimal.