Kompletten Datensatz auslesen und in Excel schreiben?

  • VB.NET

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

    Kompletten Datensatz auslesen und in Excel schreiben?

    Hallo zusammen,

    ist es möglich, dass ich eine komplette Datenbank in eine Excel Tabelle schreibe?
    Es ist so, ich habe viele Tabellen und es sollen alle durchlaufen werden bis auf ein paar Ausnahmen,
    und die Ersatzteile bei denen der Bestand unter 900 liegt, diese sollen dann in eine Excel Tabelle eingetragen werden. Geht das?

    Wie ich das dann in eine Excel Tabelle mache, werde ich evtl erst später nachfragen, viel wichtiger ist nun, dass ich die Datensätze durchlaufen kann und ausgeben kann.

    Kann mir hierbei jemand helfen?

    Mfg
    Dennis
    Hi.

    Wenn du kein extrem weltfremdes Datenbankformat benutzt, sollte es einen ADO.NET-Datenprovider dafür geben. Microsoft bietet für Exceldateien ebenfalls einen Datenprovider an. Befrage Google mal nach dem ConnectionString - ich habe ihn nicht im Kopf. Stelle zwei Datenbankverbindungen her und kopiere die Daten über SQL-Abfragen.
    Gruß
    hal2000
    Hm, also ich nutze SQL.

    Und für das Abfragen habe ich schon in etwa eine Lösung.

    VB.NET-Quellcode

    1. Dim vaio_serien() As String = New String() {"desk_j", "desk_js", "desk_l", "desk_la", "desk_lm", "desk_lt", "desk_tp", "vgn_a", "vgn_ar", "vgn_aw", "vgn_b", "vgn_bx", "vgn_bz", "vgn_c", "vgn_cr", "vgn_cs", "vgn_fe", "vgn_fj", "vgn_fs", "vgn_fw", "vgn_fz", "vgn_g", "vgn_n", "vgn_nr", "vgn_ns", "vgn_nw", "vgn_p", "vgn_s", "vgn_sr", "vgn_sz", "vgn_t", "vgn_tt", "vgn_tx", "vgn_tz", "vgn_ux", "vgn_x", "vgn_z", "vpc_b", "vpc_cw", "vpc_ea", "vpc_eb", "vpc_ec", "vpc_ee", "vpc_ef", "vpc_f", "vpc_j", "vpc_l", "vpc_m", "vpc_p", "vpc_s", "vpc_w", "vpc_x", "vpc_y", "vpc_z"}
    2. Dim myAdapter As New MySqlDataAdapter
    3. Dim myCommand As New MySqlCommand
    4. Dim myData As MySqlDataReader
    5. For Each serie As String In vaio_serien
    6. myCommand.Connection = conn
    7. conn.Close()
    8. conn.Open()
    9. myCommand.CommandText = "SELECT * FROM " + serie
    10. myAdapter.SelectCommand = myCommand
    11. myData = myCommand.ExecuteReader() ' Hier startet man die SQL Abfrage
    12. Try
    13. If myData.HasRows Then
    14. While myData.Read()
    15. If myData.Item("menge").ToString = 999999999 Then
    16. Else
    17. ListBox1.Items.Add(serie + " " + myData.Item("ersatzteil").ToString + " " + myData.Item("menge").ToString)
    18. End If
    19. End While
    20. conn.Close()
    21. conn.Open()
    22. End If
    23. Catch ex As MySqlException
    24. MsgBox(ex.Message)
    25. End Try
    26. Next


    (Die Vaio-Serien, sind die ganzen Tabellen)
    So und das möchte ich noch nach den Serien unterteilt haben.

    Wichtig ist erstmal, dass ich das ganze ausgegeben kriege, danach kann ich mit Excel spielen ^^

    Mfg
    Dennis
    Mal abgesehen davon, dass die If-Abfrage nach menge = 999999999 ziemlich sinnlos erscheint, sieht das doch recht gut aus. Nur das mit der Unterscheidung der Serien verstehe ich nicht so ganz - du hast die Unterteilung schon, da jede Serie ihre eigene Tabelle hat. Diese liest du nacheinander aus, machst dann aber die Unterteilung zunichte, indem du alles in dieselbe ListBox schreibst.

    Du kannst übrigens die SQL-Abfrage anpassen, um von vornherein nur geforderte Einträge zu erhalten. Das verringert das Datenvolumen und die If-Abfrage wird hinfällig:

    SQL-Abfrage

    1. SELECT * FROM [serie] WHERE menge < 900


    Bitte nochmal erklären, falls ich das alles missverstanden habe :)
    Gruß
    hal2000
    Leider geht das mit der SQL abfrage nicht, wie du es mir beschrieben hast.

    VB.NET-Quellcode

    1. For Each serie As String In vaio_serien
    2. myCommand.Connection = conn
    3. conn.Close()
    4. conn.Open()
    5. myCommand.CommandText = "SELECT * FROM " + serie + "WHERE menge < 999999999"
    6. myAdapter.SelectCommand = myCommand
    7. myData = myCommand.ExecuteReader() ' Hier startet man die SQL Abfrage
    8. Try
    9. If myData.HasRows Then
    10. While myData.Read()
    11. 'If myData.Item("menge").ToString = 999999999 Then
    12. 'Else
    13. ListBox1.Items.Add(myData.Item("ersatzteil").ToString + " " + myData.Item("menge").ToString)
    14. 'End If
    15. End While
    16. conn.Close()
    17. conn.Open()
    18. End If
    19. Catch ex As MySqlException
    20. MsgBox(ex.Message)
    21. End Try
    22. Next


    Error:

    Quellcode

    1. You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '< 999999999' at line 1


    Du hast es richtig verstanden ^^
    Ich wollte das schon gerne Serien geteilt haben. Sprich Serie desk_j hat das und das und desk_js hat dies und das.
    In einer Excel tabelle wäre das echt spitze, ich glaube aber das ich das nicht hinkriege.

    //EDIT:

    Ich habe es fast hinbekommen, es richtig auszugeben.
    Hier ist mein aktueller Code:

    VB.NET-Quellcode

    1. For Each serie As String In vaio_serien
    2. myCommand.Connection = conn
    3. conn.Close()
    4. conn.Open()
    5. myCommand.CommandText = "SELECT * FROM " + serie
    6. myAdapter.SelectCommand = myCommand
    7. myData = myCommand.ExecuteReader() ' Hier startet man die SQL Abfrage
    8. Try
    9. If myData.HasRows Then
    10. While myData.Read()
    11. If myData.Item("menge").ToString = 999999999 Then
    12. Else
    13. Const DATEINAME As String = "c:\protokoll.txt"
    14. ' --- Datei öffnen
    15. Dim fs As FileStream = New FileStream(DATEINAME, FileMode.OpenOrCreate, FileAccess.Write)
    16. ' --- Stream öffnen
    17. Dim w As StreamWriter = New StreamWriter(fs)
    18. ' --- Anfügen am Ende
    19. w.BaseStream.Seek(0, SeekOrigin.End)
    20. ' --- Zeilen schreiben
    21. w.WriteLine(serie)
    22. w.WriteLine(myData.Item("ersatzteil").ToString + " " + myData.Item("menge").ToString)
    23. w.Close()
    24. fs.Close()
    25. ' ListBox1.Items.Add(myData.Item("ersatzteil").ToString + " " + myData.Item("menge").ToString)
    26. End If
    27. End While
    28. conn.Close()
    29. conn.Open()
    30. End If
    31. Catch ex As MySqlException
    32. MsgBox(ex.Message)
    33. End Try
    34. Next


    Das ist die Ausgabe:
    vpc_s
    Scharniere 1
    vpc_x
    Mainboard 1
    vpc_x
    Mainboard 2
    vpc_x
    UMTS 1
    vpc_z
    Deckel 2

    Könnte ich es iwie so machen das es so ausgegeben wird:
    VPC-S
    Scharniere 1

    VPC-X
    Mainboard 1
    Mainboard 2
    UMTS 1

    VPC-Z
    Deckel 2

    Wenn es gleich eine Möglichkeit gibt das in eine Tabelle einzutragen und auszugeben, sprich nur fürs drucken wäre das schon mein Ziel. Weiß jemand weiter?

    MFg
    Dennis

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

    - Öffne die Datei vor der Schleife.
    - Schreibe direkt unter den For-Schleifenkopf die Serie in die Datei
    - Schreibe das Abfrageergebnis in der While-Schleife.
    - Schließe die Datei erst nach dem "Next" wieder.

    Die Abfrage in der Mitte macht absolut keinen Sinn. Der Else-Zweig wird ausgeführt, wenn menge ungleich 999999999 O.o
    Gruß
    hal2000
    Ich weiß ^^, ich habe es vorhin während ich noch auf der Arbeit war, schnell gebastelt ^^

    Habs ja nun so gemacht:

    VB.NET-Quellcode

    1. If myData.Item("menge").ToString < "999999999" Then


    Nun habe ich aber das Problem, es schön in eine Tabelle auszugeben und danach zu drucken....

    Aber danke für deine/eure Hilfe :)

    Mfg
    Dennis
    Leider geht das mit der SQL abfrage nicht, wie du es mir beschrieben hast.

    VB.NET-Quellcode

    1. myCommand.CommandText = "SELECT * FROM " + serie + "WHERE menge < 999999999"

    gibt natürlich Syntaxfehler.

    VB.NET-Quellcode

    1. myCommand.CommandText = "SELECT * FROM " + serie + " WHERE menge < 999999999"
    ist der kleine aber feine Unterschied
    --
    If Not Program.isWorking Then Code.Debug Else Code.DoNotTouch
    --
    schreib doch dein SQL-Select in eine Dataset und dieses lädst du dann bei OleDB-Verbindung in die Exceldatei..sollte eigentlich ohne Probleme funktionieren.
    Dazwischen kann du die Daten auch ohne Probleme im Dataset bearbeiten..
    Hi,

    das mit dem MySqlConnection brauchst du ja auch für deine MySQL Datenbank ;) Die OleDBConnection wird benötigt für die Verbindung zur Exceldatei.
    Hab jetzt leider nichts in VB.Net gefunden oO

    Aber hier mal zwei links für den Zugriff per OLEBD und Excel

    Excel: DataTable mittels OLEDB in Excel-Dokument exportieren
    dotnet-snippets.de/dns/excel-d…t-exportieren-SID272.aspx

    Excel: alle Tabellen über OleDb in DataSet lesen
    dotnet-snippets.de/dns/excel-a…dataset-lesen-SID637.aspx