Datatable Rows in MySQL effizient hinzufügen

  • VB.NET

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

    Datatable Rows in MySQL effizient hinzufügen

    huhu liebe Gemeinde,

    mein Code lädt bereits einzelne Rows einer Datatable in eine MySQL Table erfolgreich hoch.

    Leider ist er sehr ineffizient , d.h. ,es dauert bereits ab 50 Entries. Inwieweit lässt sich dieser Prozess beschleunigen?

    Vielen Dank und mit freundlichem Gruß

    VB.NET-Quellcode

    1. For i As Integer = 0 To dt_liste1.Rows.Count - 1
    2. SQLConnection = New MySqlConnection()
    3. SQLConnection.ConnectionString = connectionString
    4. Dim str_carSql As String
    5. Try
    6. Using SQLConnection As New MySqlConnection(connectionString)
    7. Using sqlCommand As New MySqlCommand()
    8. With sqlCommand
    9. .CommandText = "INSERT INTO tabelle (`Indexo`, `Random_Index`, `String`) values (@xid1,@xid2,@xid3)"
    10. .Connection = SQLConnection
    11. .CommandType = CommandType.Text
    12. .Parameters.AddWithValue("@xid1", CInt(dt_liste1.Rows(i)(0)))
    13. .Parameters.AddWithValue("@xid2", CInt(dt_liste1.Rows(i)(1)))
    14. .Parameters.AddWithValue("@xid3", dt_liste1.Rows(i)(2).ToString)
    15. End With
    16. Try
    17. SQLConnection.Open()
    18. sqlCommand.ExecuteNonQuery()
    19. Catch ex As MySqlException
    20. MsgBox(ex.Message.ToString)
    21. Finally
    22. SQLConnection.Close()
    23. End Try
    24. End Using
    25. End Using
    26. Catch ex As Exception
    27. End Try
    28. Next
    Pack das Erzeugen und Öffnen deiner Datenbankverbindung und verfrachte es außerhalb der Schleife.
    Was du bisher machst, ist folgendes: Du machst eine Schleife, die bei jedem durchlaufen eine Datenbankverbindung aufbaut (dauert lange), anschließend ein SQL Command ausführt (dauert) und dann die Verbindung wieder schließt.

    Außerdem: schmeiß bitte das Try Catch weg. Wenn du eine Fehlermeldung bekommst, dann hat die auch einen Sinn (das .NET Fw wift nicht aus Spaß einfach so iwelche Exeptions ;D)

    Edit: Als Reihenfolge:
    1.) Datenbankverbindunug mit ConnectionString herstellen
    2.) Datenbankverbindung öffnen
    3.) Command erzeugen mit DbParametern erzeugen
    4.) Schhleife schreiben
    5.) In der Schleife die DbParameter ersetzen und Command ausführen
    6.) Schleife laufen lassen
    7.) Nach Ende der Schleife die Verbidnung schließen

    Probier mal den Code hier aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim str_carSql As String
    2. Using SQLConnection As New MySqlConnection(connectionString)
    3. SQLConnection.Open()
    4. Dim querysString As String = "INSERT INTO tabelle (`Indexo`, `Random_Index`, `String`) values (@xid1,@xid2,@xid3)"
    5. Using sqlCommand As New MySqlCommand(querysString, SQLConnection)
    6. For i As Integer = 0 To dt_liste1.Rows.Count - 1
    7. With sqlCommand
    8. .Parameters.AddWithValue("@xid1", CInt(dt_liste1.Rows(i)(0)))
    9. .Parameters.AddWithValue("@xid2", CInt(dt_liste1.Rows(i)(1)))
    10. .Parameters.AddWithValue("@xid3", dt_liste1.Rows(i)(2).ToString)
    11. End With
    12. sqlCommand.ExecuteNonQuery()
    13. Next
    14. End Using
    15. End Using
    Is jetzt mit Notepad++ "korrigiert" worden, also Verzeihung für auftretende Fehler

    Lg Radinator
    In general (across programming languages), a pointer is a number that represents a physical location in memory. A nullpointer is (almost always) one that points to 0, and is widely recognized as "not pointing to anything". Since systems have different amounts of supported memory, it doesn't always take the same number of bytes to hold that number, so we call a "native size integer" one that can hold a pointer on any particular system. - Sam Harwell

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Radinator“ ()

    Ich habe diesen Ansatz versucht und bekam folgenden Error:


    Ein Ausnahmefehler des Typs "MySql.Data.MySqlClient.MySqlException" ist in MySql.Data.dll aufgetreten.

    Zusätzliche Informationen: Parameter '@xid1' has already been defined.


    Radinator schrieb:

    Pack das Erzeugen und Öffnen deiner Datenbankverbindung und verfrachte es außerhalb der Schleife.
    Was du bisher machst, ist folgendes: Du machst eine Schleife, die bei jedem durchlaufen eine Datenbankverbindung aufbaut (dauert lange), anschließend ein SQL Command ausführt (dauert) und dann die Verbindung wieder schließt.

    Außerdem: schmeiß bitte das Try Catch weg. Wenn du eine Fehlermeldung bekommst, dann hat die auch einen Sinn (das .NET Fw wift nicht aus Spaß einfach so iwelche Exeptions ;D)

    Edit: Als Reihenfolge:
    1.) Datenbankverbindunug mit ConnectionString herstellen
    2.) Datenbankverbindung öffnen
    3.) Command erzeugen mit DbParametern erzeugen
    4.) Schhleife schreiben
    5.) In der Schleife die DbParameter ersetzen und Command ausführen
    6.) Schleife laufen lassen
    7.) Nach Ende der Schleife die Verbidnung schließen

    Probier mal den Code hier aus:
    Spoiler anzeigen

    VB.NET-Quellcode

    1. Dim str_carSql As String
    2. Using SQLConnection As New MySqlConnection(connectionString)
    3. SQLConnection.Open()
    4. Dim querysString As String = "INSERT INTO tabelle (`Indexo`, `Random_Index`, `String`) values (@xid1,@xid2,@xid3)"
    5. Using sqlCommand As New MySqlCommand(querysString, SQLConnection)
    6. For i As Integer = 0 To dt_liste1.Rows.Count - 1
    7. With sqlCommand
    8. .Parameters.AddWithValue("@xid1", CInt(dt_liste1.Rows(i)(0)))
    9. .Parameters.AddWithValue("@xid2", CInt(dt_liste1.Rows(i)(1)))
    10. .Parameters.AddWithValue("@xid3", dt_liste1.Rows(i)(2).ToString)
    11. End With
    12. sqlCommand.ExecuteNonQuery()
    13. Next
    14. End Using
    15. End Using
    Is jetzt mit Notepad++ "korrigiert" worden, also Verzeihung für auftretende Fehler

    Lg Radinator
    Versuchs mal damit:

    VB.NET-Quellcode

    1. For i As Integer = 0 To dt_liste1.Rows.Count - 1
    2. With sqlCommand
    3. .Parameters.Clear() 'Parameter sind ja noch vorhanden, von daher Leeren wir einfach die Parameterliste bevor wir sie neu Befüllen
    4. .Parameters.AddWithValue("@xid1", CInt(dt_liste1.Rows(i)(0)))
    5. .Parameters.AddWithValue("@xid2", CInt(dt_liste1.Rows(i)(1)))
    6. .Parameters.AddWithValue("@xid3", dt_liste1.Rows(i)(2).ToString)
    7. End With
    8. sqlCommand.ExecuteNonQuery()
    9. Next

    EaranMaleasi schrieb:

    Versuchs mal damit:

    VB.NET-Quellcode

    1. For i As Integer = 0 To dt_liste1.Rows.Count - 1
    2. With sqlCommand
    3. .Parameters.Clear() 'Parameter sind ja noch vorhanden, von daher Leeren wir einfach die Parameterliste bevor wir sie neu Befüllen
    4. .Parameters.AddWithValue("@xid1", CInt(dt_liste1.Rows(i)(0)))
    5. .Parameters.AddWithValue("@xid2", CInt(dt_liste1.Rows(i)(1)))
    6. .Parameters.AddWithValue("@xid3", dt_liste1.Rows(i)(2).ToString)
    7. End With
    8. sqlCommand.ExecuteNonQuery()
    9. Next


    Vielen Dank für die schnelle Antwort! :)

    Was mich wundert ist, ich ging davon aus, dass ein With Event sofort neue Parameter generiert, müssen anscheinend also vorher immer gecleared werden.?
    und ist sauberer, als was bisher gemacht wird.
    Ist ja nicht sinnvoll, für jeden Datensatz die ParameterCollection zu löschen und neu aufzubauen.
    Es reicht ja, wenn das nur einmal gemacht wird, und dann werden die Parameter-Werte nur immer neu gesetzt - genau das macht ein DataAdapter (und noch mehr).

    Am Effizientesten (s. Thread-Titel) ist, wenn man sich initial mittm CommandBuilder einen DataAdapter generiert, und den dann Updaten lässt. Der updated dann alle 3 Sachen in einem Abwasch: Deletes, Updates, Inserts.
    Und der updated auch nicht alle, die in der DataTable sind, sondern nur die Datensätze, die wirklich geändert wurden.