Hallo,
ich habe folgendes Problem:
Ich habe insgesamt 16 Datatables, die ich per SQL-Abfrage mit Daten fülle.
Insgesamt komme ich auf ca. 16000 Datensätze, die die 16 Datatables umfassen.
Nun durchlaufe ich jedes Datatable einzelnd mit einer For each-Schleife.
Hier ein Beispiel:
Nun ist das Problem, dass ich alle 16 Datatables wie im obigen Beispiel mit einer For each-Schleife durchlaufe und das dauert ca. 10-15 Minuten.
Liegt das an der Anzahl der Datensätze, oder liegt das an der Programmierung meinerseits ?
Wie ihr seht, werden die Daten aus der MySQL-Datenbank gelesen, dann in eine Datatable gefüllt und dann wird mit einer For each-Schleife ein Update oder Insert
in die SQLite-Datenbank gemacht.
Ebenfalls ist dies nur beim 1 Klick auf den Button der Fall, da alle Datensätze dann schon in die SQLite-Datenbank importiert wurden.
Es wird dann nur noch nachgeschaut, ob Änderungen vorgenommen wurden, dies erkennt man anhand des speicherdatums.
Freue mich über Antworten.
vivil
ich habe folgendes Problem:
Ich habe insgesamt 16 Datatables, die ich per SQL-Abfrage mit Daten fülle.
Insgesamt komme ich auf ca. 16000 Datensätze, die die 16 Datatables umfassen.
Nun durchlaufe ich jedes Datatable einzelnd mit einer For each-Schleife.
Hier ein Beispiel:
VB.NET-Quellcode
- 'Alle Daten auf dem Server durchlaufen:
- For Each row As DataRow In taStep.Rows
- 'Nachschauen, ob diese id auf der SQLite-Datenbank vorhanden ist:
- Dim findRowStep() As DataRow = taStepSQLite.Select("idprocessstepmysql = " & row("idprocessstep"))
- If findRowStep.Length > 0 Then
- Dim speicherdatumMysql As DateTime = Convert.ToDateTime(row("speicherdatum"))
- Dim speicherdatumSQLite As DateTime = findRowStep(0).Item("speicherdatum")
- 'Wenn die id vorhanden ist, dann soll nachgeschaut werden,
- 'ob sich wirklich was geändert hat -> Sehen wir an beiden Speicherdaten:
- If speicherdatumMysql > speicherdatumSQLite Then
- 'Dim dicUpdate As New Dictionary(Of String, String)
- Dim sqlcmd As New SQLite.SQLiteCommand
- Dim sql As String = ""
- sql = "UPDATE processstep SET idprocesssub = " & row("idprocesssub") & ", idprocessglobalname = " & row("idprocessglobalname") & _
- ", name = '" & row("name") & "', description = '" & row("description") & "', processlevel = " & row("processlevel") & ", " & _
- "idprev = " & row("idprev") & ", idnext = '" & row("idnext") & "', del = " & Convert.ToInt32(row("del")) & _
- ", position = '" & row("position").ToString().Replace("'", "''") & "', xml_id = '" & row("xml_id") & "'" & _
- ", lon = @lon, lat = @lat, idbranch_art = " & row("idbranch_art") & ", idprocessstep_dummy = '" & row("idprocessstep_dummy") & "'" & _
- ", manuellgesetzt = " & Convert.ToInt32(row("manuellgesetzt")) & ", x = " & row("x") & ", y = " & row("y") & _
- ", idmap = " & row("idmap") & ", speicherdatum = '" & Convert.ToDateTime(row("speicherdatum")).ToString("yyyy-MM-dd HH:mm:ss") & _
- "' WHERE idprocessstepmysql = " & findRowStep(0).Item("idprocessstep")
- With sqlcmd
- .CommandText = sql
- .Connection = main.cnSQLite
- .Parameters.AddWithValue("@lon", row("lon"))
- .Parameters.AddWithValue("@lat", row("lat"))
- .ExecuteNonQuery()
- End With
- End If
- Else
- 'Wenn die id nicht vorhanden ist, dann soll ein Insert erfolgen.
- 'Dabei soll die idprocessstepmysql = der idprocessstep auf dem Server sein.
- 'Da sonst die ids durcheinander kommen können.
- Dim sqlcmd As New SQLite.SQLiteCommand
- Dim sql As String = ""
- sql = "INSERT INTO processstep(idprocessstepmysql, idprocesssub, idprocessglobalname, name, description, processlevel " & _
- ", idprev, idnext, del, position, xml_id, lon, lat, idbranch_art, idprocessstep_dummy, manuellgesetzt, x, y " & _
- ", idmap, speicherdatum) VALUES(" & row("idprocessstep") & ", " & row("idprocesssub") & ", " & row("idprocessglobalname") & _
- ", '" & row("name") & "', '" & row("description") & "', " & row("processlevel") & ", " & row("idprev") & _
- ", '" & row("idnext") & "', " & Convert.ToInt32(row("del")) & ", '" & row("position").ToString().Replace("'", "''") & "'" & _
- ", " & row("xml_id") & ", @lon, @lat, '" & row("idbranch_art") & "', '" & row("idprocessstep_dummy") & "'" & _
- ", " & Convert.ToInt32(row("manuellgesetzt")) & ", " & row("x") & ", " & row("y") & ", " & row("idmap") & _
- ", '" & Convert.ToDateTime(row("speicherdatum")).ToString("yyyy-MM-dd HH:mm:ss") & "')"
- With sqlcmd
- .CommandText = sql
- .Connection = main.cnSQLite
- .Parameters.AddWithValue("@lon", row("lon"))
- .Parameters.AddWithValue("@lat", row("lat"))
- .ExecuteNonQuery()
- End With
- End If
- Next
Nun ist das Problem, dass ich alle 16 Datatables wie im obigen Beispiel mit einer For each-Schleife durchlaufe und das dauert ca. 10-15 Minuten.
Liegt das an der Anzahl der Datensätze, oder liegt das an der Programmierung meinerseits ?
Wie ihr seht, werden die Daten aus der MySQL-Datenbank gelesen, dann in eine Datatable gefüllt und dann wird mit einer For each-Schleife ein Update oder Insert
in die SQLite-Datenbank gemacht.
Ebenfalls ist dies nur beim 1 Klick auf den Button der Fall, da alle Datensätze dann schon in die SQLite-Datenbank importiert wurden.
Es wird dann nur noch nachgeschaut, ob Änderungen vorgenommen wurden, dies erkennt man anhand des speicherdatums.
Freue mich über Antworten.
vivil