Im DataReader einen Datensatz zurück

  • VB.NET
  • .NET (FX) 4.5–4.8

Es gibt 2 Antworten in diesem Thema. Der letzte Beitrag () ist von DrZwockel.

    Im DataReader einen Datensatz zurück

    Hallo VB-Gemeinde,

    ich stehe vor einem kleinen Problem.

    Ich habe eine Datenbankabfrage, die eine 24-Stunden-Auswertung fährt. Diese wird aus der DB ausgelesen und einem DataReader übergeben. Soweit so gut.
    Der DataReader wird dann mit einer While - Schleife solange durchlaufen, wie Rows vorhaden sind (HasRows). Die einzelnen Inhalte werden dann in einer Exceltabelle einetragen.
    Leider kann es vorkommen, dass es für eine Stunde keine Werte gibt.

    Beispiel: 01, 02, 04, ... hier würde die Stunde 03 fehlen.

    Mittels einer If-Abfrage wird beim Lesen des Readers hierbei geprüft, ob Stunde = Stunde ist (hierbei wird eine fortlaufende Stundenzahl mitgeführt). Ist die laufende Stunde mit der Stunde des Datensatzes nicht identisch, wird über den else-Zweig eine Dummy-Zeile in das Exceltabellenblatt eingefügt, damit es nicht zu einer Lücke kommt.

    Dies funktioniert sehr gut, bis die erste Lücke gefüllt ist. Beim nächsten Durchlaufen des Readers ist der aber schon 1 Stunde weiter, so dass es ab jetzt immer eine Stunde unterschied gibt und nur Dummy-Zeilen eingefüht werden.

    Jetzt meine Frage: gibt es eine Möglichkeit, den Reader um eine Position zurückzusetzen?

    Hier mal der Code:

    VB.NET-Quellcode

    1. ...
    2. If Reader.HasRows Then
    3. While Reader.Read()
    4. RowCount += 1
    5. CellNr = (StartRow + RowCount)
    6. '
    7. If Stunde = 23 Then
    8. Stunde = 0
    9. Else
    10. Stunde += 1
    11. End If
    12. If Stunde = Reader(2) Then
    13. ws.Cells(CellNr, 1).value = Reader(0).ToString
    14. ws.Cells(CellNr, 2).value = Reader(1).ToString
    15. ws.Cells(CellNr, 3).value = Reader(2)
    16. ws.Cells(CellNr, 4).value = Reader(3).ToString
    17. ws.Cells(CellNr, 5).value = Reader(4).ToString
    18. ws.Cells(CellNr, 6).value = Reader(5)
    19. ws.Cells(CellNr, 7).value = Reader(6)
    20. Else
    21. ws.Cells(CellNr, 1).value = Strings.Left((RowCount / 24) + 1, 1)
    22. ws.Cells(CellNr, 2).value = Switch(ws.Cells(CellNr, 1).value = 1, "MONTAG", ws.Cells(CellNr, 1).value = 2, "DIENSTAG", ws.Cells(CellNr, 1).value = 3, "MITTWOCH", ws.Cells(CellNr, 1).value = 4, "DONNERSTAG", ws.Cells(CellNr, 1).value = 5, "FREITAG", ws.Cells(CellNr, 1).value = 6, "SAMSTAG", ws.Cells(CellNr, 1).value = 7, "SONNTAG")
    23. '### Stunde berechnen
    24. If IsNumeric(ws.Cells(CellNr - 1, 3).value) And ws.Cells(CellNr - 1, 3).value < 23 Then
    25. ws.Cells(CellNr, 3).value = ws.Cells(CellNr - 1, 3).value + 1
    26. ElseIf Not IsNumeric(ws.Cells(CellNr - 1)) Or ws.Cells(CellNr - 1, 3).value = 23 Then
    27. ws.Cells(CellNr, 3).value = 0
    28. End If
    29. '
    30. ws.Cells(CellNr, 4).value = "0"
    31. ws.Cells(CellNr, 5).value = "0"
    32. ws.Cells(CellNr, 6).value = "00:00:00"
    33. ws.Cells(CellNr, 7).value = "00:00:00"
    34. End If
    35. End While
    36. End If
    37. ...



    Vielen Dank für Eure Mithilfe,

    Gruß vom Doc
    Nein, zurück geht nicht.

    Du kannst das Problem mit einem anderen Ablauf lösen. Indem du kein If-Then-Else benutzt, sondern vor dem Eintragen des gerade gelesenen Datensatzes deine Bedingung überprüfst und einschiebst, dann ganz normal in der Schleife mit dem Übernehmen des Datensatzes weitermachst.
    Wenn es auch mal vorkommen kann, dass mehr als eine Stunde fehlt (ich würde grundsätzlich von der Möglichkeit ausgehen), wäre hier sogar eine Schleife in der Schleife sinnvoll.

    Also sowas wie

    VB.NET-Quellcode

    1. Dim dsStunde = Reader(2)
    2. While Stunde < dsStunde
    3. '... Dummy-Eintrag erzeugen
    4. Stunde = (Stunde + 1) Mod 24
    5. End While
    6. '... gelesenen Datensatz eintragen
    7. ws.Cells(CellNr, 1).value = Reader(0).ToString
    8. ' ... etc.
    Weltherrschaft erlangen: 1%
    Ist dein Problem erledigt? -> Dann markiere das Thema bitte entsprechend.
    Waren Beiträge dieser Diskussion dabei hilfreich? -> Dann klick dort jeweils auf den Hilfreich-Button.
    Danke.
    Hallo Arby,

    zunächst einmal vielen Dank für Deinen Tipp. Leider lässt es sich so nicht umsetzen ... allerdings hast Du mich auf einen neuen Weg geführt, den ich derzeit versuche zu Ende zu denken .. ich werde berichten ;)

    Gruß vom Doc