Ein bestimmtes Feld in jedem Datenbankeintrag auslesen, verändern und wieder neu einspielen.

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

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

    Ein bestimmtes Feld in jedem Datenbankeintrag auslesen, verändern und wieder neu einspielen.

    Hallo Leute,

    irgendwie stehe ich auf dem Schlauch und bevor ich es zu kompliziert (und unnötig) mache, frage ich lieber Euch Profis.

    Ich habe eine sehr große Datenbank mit Artikeln.
    Ein Feld "webtext" enthält einen RTF-String.

    Ich habe eine Funktion die den RTF-String in einen HTMl-String umwandelt: Public Function ConvertRTFToHTML(RT_Text As String) As String

    Nun suche ich die kürzeste und eleganteste Codeform in dem ich von jedem Datensatz das feld "webtext" auslese, modifiziere und dann wieder speichere ("UPDATE"?).

    Hier ein Codeabschnitt mit dem ich (theoretisch) das Feld "webtext" bei jedem Artikel leeren würde. Nur so als Ausgangspunkt.

    Wie gehe ich am besten vor?

    VB.NET-Quellcode

    1. Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Path.Combine(BONitERP2_DatenOrdner, "onlineshop.mdb") & "; Jet OLEDB:Database Password=" & DatenbankPasswort & ";" & SpeedUpString)
    2. Dim cmd As New OleDbCommand
    3. Dim sql As String = ""
    4. conn.Open()
    5. sql = "UPDATE Artikel SET webtext ='';"
    6. cmd = New OleDbCommand(sql, conn)
    7. cmd.ExecuteNonQuery()
    8. conn.Close()



    Leute, ist erledigt. Könnt diesen Beitrag gerne löschen oder auch stehen lassen, falls meine Lösung für andere praktikabel ist:

    VB.NET-Quellcode

    1. ''' <summary>
    2. ''' Wandelt alle RTF-Texte in HTML-Texte um (onlineshop.erp2)
    3. ''' </summary>
    4. ''' <remarks></remarks>
    5. Public Sub OnlineShopDatenbankInHTMLUmwandlen()
    6. Dim conn As OleDbConnection = New OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source=" & Path.Combine(BONitERP2_DatenOrdner, "onlineshop.erp2") & "; Jet OLEDB:Database Password=" & DatenbankPasswort & ";" & SpeedUpString)
    7. Dim cmd As New OleDbCommand
    8. Dim reader As OleDbDataReader
    9. Dim sql As String = ""
    10. Dim Temp_Webtext As String
    11. Dim Temp_WebArtikel As String
    12. conn.Open()
    13. sql = "SELECT * FROM artikel;"
    14. cmd = New OleDbCommand(sql, conn)
    15. reader = cmd.ExecuteReader
    16. Do While reader.Read()
    17. Temp_WebArtikel = reader("Artikelnummer").ToString
    18. Temp_Webtext = reader("webtext").ToString
    19. Temp_Webtext = ConvertRTFToHTMLFuerOnlineshop(Temp_Webtext)
    20. sql = "UPDATE artikel SET webtext='" + Replace(Temp_Webtext, "'", "''") + "' WHERE artikelnummer='" + Temp_WebArtikel + "';"
    21. cmd = New OleDbCommand(sql, conn)
    22. cmd.ExecuteNonQuery()
    23. Loop
    24. reader.Close()
    25. conn.Close()
    26. End Sub

    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at

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

    Ich würde mir für das Lesen über cmd.ExecuteReader() mir einen DataReader packen, und den eben mit While(reader.Read()) durchlaufen. Innerhalb der Schleife kannst du dann das entsprechende Feld der Zeile lesen, anpassen, und dann ein Update absetzen. Da du jedoch gerade einen Reader offen hast, kann es sein, dass du für das Update eine zweite Verbindung öffnen musst. Falls das aufgrund der Arbeit mit einer Datei nicht funktioniert, könntest du auch immer einen "chunk" lesen, z.B. 100 oder 1000 Datensätze, die verarbeiten, und dann mit Update aktualisieren. Oder, wenn der RAM-Verbrauch egal ist, die Tabelle komplett in den RAM laden, entweder "verschwenderisch" über DataAdapter in ne DataTable oder mithilfe des Readers in z.B. ein Dictionary und dann alles bearbeiten und alles wieder per Update aktualisieren.
    @EaranMaleasi
    Da du jedoch gerade einen Reader offen hast, kann es sein, dass du für das Update eine zweite Verbindung öffnen musst.


    Das war auch meine Befürchtung und deshalb war ich mir nicht sicher ob man das überhaupt "darf". Ich habe es jetzt so gemacht (siehe oben) und es scheint zu funktionieren.
    Liebe Grüße
    Roland Berghöfer

    Meine aktuellen und kostenlos verwendbaren Tools (mit VB.NET erstellt): freeremarkabletools.com | priconman.com | SimpleCalendar | AudibleTouch | BOComponent.com | bonit.at