Moin Leute, hab gerade ein "kleines" Programm auf dem Prüfstand welches Daten in die SQL Datenbank schreibt. Das funktioniert auch!Nur leider ist es total langsam!!!! D.h. es werden ungefähr 1 - 2 Datensätze in der Sekunde geschrieben:Ich versuche mal kurz zu erläutern wie mein Programm aufgebaut ist:Der IO Reader liest die Daten aus einer CSV Datei:
Logmessage zeigt mir in einer *.txt wie lange das dauert. Also in einer Sekunde ungefähr 35 Datensätze
Jetzt werden die Daten aufbereitet und in die jeweiligen Variablen geschrieben und anschließend auf unseren SQL hochgeladen.
Das Senden der SQL Befehle geht auch fix. Auch rund 30 Datensätze pro Sekunde.
Keine Ahnung warum das Programm so langsam ist... erkennt evtl. jemand den Flaschenhals?
Gruß
Logmessage zeigt mir in einer *.txt wie lange das dauert. Also in einer Sekunde ungefähr 35 Datensätze
VB.NET-Quellcode
- 'Datei wird eingebunden mit entsprechender Codierung
- LogMessage("__IOREADER " & TimeOfDay & " anfang")
- Using ioReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(einzeldatei, System.Text.Encoding.GetEncoding("ISO-8859-1"))
- 'delimiter wird eingerichtet
- ioReader.TextFieldType = FileIO.FieldType.Delimited
- 'delimiter Zeichen
- ioReader.SetDelimiters(",")
- 'Solange die Daten nicht leer sind
- While Not ioReader.EndOfData
- LogMessage("__IOREADER " & TimeOfDay & " anfang")
- 'lese aktuelle Line und springe 1 Zeile weiter
- ioReader.ReadLine()
- 'Beginne ab Zeile 3
- If ioReader.LineNumber > 2 Then
- 'schreibe ins Array die Werte
- arrcurrentrow = ioReader.ReadFields()
- übertragung()
- LogMessage("__IOREADER " & TimeOfDay & " ENDE")
- Else
- End If
- End While
- End Using
Jetzt werden die Daten aufbereitet und in die jeweiligen Variablen geschrieben und anschließend auf unseren SQL hochgeladen.
Das Senden der SQL Befehle geht auch fix. Auch rund 30 Datensätze pro Sekunde.
VB.NET-Quellcode
- Dim dtrs As DataTable
- 'Zeit wird umformatiert / geparst
- Dim datum As DateTime
- datum = arrcurrentrow(0)
- Date.TryParseExact(datum, "dd.MM.yyyy HH:mm:ss", Globalization.CultureInfo.CurrentCulture, Globalization.DateTimeStyles.None, dtUHRZEIT)
- 'LogMessage("sql übertragung " & TimeOfDay & " anfang")
- 'Datenarray wird in Variablen gespeichert
- UHRZEIT = Format(dtUHRZEIT, "yyyyMMddHHmmss")
- USERNAME = arrcurrentrow(1)
- iANZAHL_SEITEN = arrcurrentrow(2)
- copies = arrcurrentrow(3)
- strDRUCKERNAME = arrcurrentrow(4)
- strdocumentname = arrcurrentrow(5)
- strclient = arrcurrentrow(6)
- strpapersize = arrcurrentrow(7)
- strlanguage = arrcurrentrow(8)
- duplex = arrcurrentrow(11)
- strgrayscale = arrcurrentrow(12)
- strsize = arrcurrentrow(13)
- If duplex = "NOT DUPLEX" Then
- intduplex = 0
- Else
- intduplex = 1
- End If
- If strgrayscale = "NOT GRAYSCALE" Then
- intgrayscale = 0
- Else
- intgrayscale = 1
- End If
- If strsize.ToLower.Contains("kb") Then
- strsize = strsize.ToLower.Replace("kb", "")
- ElseIf strsize.ToLower.Contains("mb") Then
- strsize = strsize.ToLower.Replace("mb", "")
- End If
- If strdocumentname.ToLower.Contains("'") Then
- strdocumentname = strdocumentname.ToLower.Replace("'", "''")
- End If
- 'Schreibe Variablen in Datensatz für Klasse clsDatensatz
- Dim Datensatz As New clsDatensatz
- Datensatz.UHRZEIT = UHRZEIT
- Datensatz.USERNAME = If(USERNAME.Length < 50, USERNAME, USERNAME.Substring(0, 50))
- Datensatz.ANZAHL_SEITEN = iANZAHL_SEITEN
- Datensatz.copies = copies
- Datensatz.DRUCKERNAME = If(strDRUCKERNAME.Length < 50, strDRUCKERNAME, strDRUCKERNAME.Substring(0, 50))
- Datensatz.dokumentname = If(strdocumentname.Length < 100, strdocumentname, strdocumentname.Substring(0, 100))
- Datensatz.client = If(strclient.Length < 20, strclient, strclient.Substring(0, 20))
- Datensatz.papersize = If(strpapersize.Length < 5, strpapersize, strpapersize.Substring(0, 5))
- Datensatz.language = If(strlanguage.Length < 25, strlanguage, strlanguage.Substring(0, 25))
- Datensatz.duplex = intduplex
- Datensatz.FARBCODE = intgrayscale
- Datensatz.size = strsize
- lstDatensatz.Add(Datensatz)
- 'LogMessage("sql übertragung " & TimeOfDay & " ende")
- 'Für jeden Datensatz
- For Each ocelot As clsDatensatz In lstDatensatz
- 'LogMessage("sql insert " & ocelot.USERNAME & " " & ocelot.UHRZEIT & " anfang")
- sql = "select * from printlog where username = '" & ocelot.USERNAME & "' and uhrzeit = '" & ocelot.UHRZEIT & "' and druckername = '" & ocelot.DRUCKERNAME & "'"
- dtrs = DoSQLQuery(sql, dateiname)
- If dtrs.Rows.Count = 0 Then
- 'Datensatz schreiben
- '("Der rote Text sind die Spaltennamen in der SQL-Datenbank. DIESE MÜSSEN IDENTISCH heißen wie in der SQL-Datenbank. Das Schwarze sind die Einträge"
- sql = "insert into printlog " & "(uhrzeit, username, anzahl_seiten, copies, documentname, druckername, clientname, papersize, driver, duplex, grayscale, printsizes) " &
- "values ('" & ocelot.UHRZEIT & "', '" & ocelot.USERNAME & "', " & ocelot.ANZAHL_SEITEN & ", " & ocelot.copies & ", '" & ocelot.dokumentname & _
- "', '" & ocelot.DRUCKERNAME & "', '" & ocelot.client & "', '" & ocelot.papersize & "', '" & ocelot.language & "', " & ocelot.duplex & ", " & _
- ocelot.FARBCODE & ", " & ocelot.size & ")"
- Try
- DoSQLExecute(sql)
- Catch ex As Exception
- SendeMail("Printlogger meldet: Fehler Datenbankzugriff nicht möglich", "Fehler beim Hochladen der Datei " & dateiname & vbCrLf & sql & vbCrLf & ex.Message & vbCrLf & vbCrLf & "Das Programm wurde beendet.", {"xxxxxxxxxxxxxxxxx@xxxxxxxxxxx.com"}, "Hardcore-Print@xxxxxxxxxx.com", "HardcorePrint")
- killswitch()
- End Try
- Else
- End If
- 'LogMessage("sql insert ende " & ocelot.USERNAME & " " & ocelot.UHRZEIT & " ende")
- Next
- End Sub
Keine Ahnung warum das Programm so langsam ist... erkennt evtl. jemand den Flaschenhals?
Gruß
Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Trade“ ()