Effiziente Speicherung von Felddaten in lokaler Datenbank

08/10/2008 - 10:18 von Klaus Gollin | Report spam
Hallo zusammen,

ich habe folgendes Problem:

über einen Web-Service beziehe ich eine Menge von Messdaten, die in ein
2-spaltiges Feld übertragen werden. Hierbei handelt es sich um Datenmengen
von 30.000 - 120.000 Records.

Mein derzeitiger Ansatz benötigt zum Speichern von 70.000 Zeilen in einer
lokalen Access DB ca. 2:45 Minuten.

Da der Abruf von Daten ansich sehr schnell geht (ca. 10 Sekunden braucht der
Web-Service, die Daten anzuliefern), ist klar, dass die zeilenweise
Speicherung mittels INSERT nicht sehr effizient ist.

Nun suche ich eine Möglichkeit, die Daten möglichst schnell in eine
Datenbank zu verschieben, bzw. die Daten ggf. gleich in eine Tabelle zu
transferieren, ohne über das Array zu gehen.

Das Ergebnis des Web-Service wird wie folgt gespeichert:

Dim result() As de.myhomepage.mysubdomain.MesswertTransferObjekt

wobei MesswertTransferObjekt folgende Eigenschaften aufweist:

Zeitpunkt As System.Nullable(Of Date)
Messwert as Single

Gibt es vielleicht irgendwas in der Art "SELECT *** INTO", das auf Felder
anwendbar ist?

Oder ließe sich der Inhalt des Arrays vielleicht in eine DataTable
transformieren, so dass ggf. über ein DataSet gearbeitet werden könnte?

Über einen hilfreichen Tip würde ich mich sehr freuen.

Klaus
 

Lesen sie die antworten

#1 Stefan Falz [MVP]
09/10/2008 - 02:19 | Warnen spam
Hallo Klaus,

"Klaus Gollin" schrieb:

Mein derzeitiger Ansatz benötigt zum Speichern von 70.000 Zeilen in einer
lokalen Access DB ca. 2:45 Minuten.

Da der Abruf von Daten ansich sehr schnell geht (ca. 10 Sekunden braucht der
Web-Service, die Daten anzuliefern), ist klar, dass die zeilenweise
Speicherung mittels INSERT nicht sehr effizient ist.



probier doch mal, die Daten vom Webservice in kommaseparierte Werte umzuwandeln
und als CSV Datei zu speichern. Die CSV Datei kannst Du dann komplett mit einem
INSERT INTO ... SELECT ... FROM ... in die Access Datenbank reinschreiben.

Der Import selbst geht deutlich schneller (normalerweise nicht mehr als 1 oder
2 Sekunden), wie lange Du für das Transformieren der Daten brauchst, weiß ich
aber nicht :)



Dim ConnectionString As String
ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=X:\Ordner\Datenbank.mdb;"

Dim ImportSql As String
ImportSql = "INSERT INTO <AccessTabelle> ( <Spaltenliste> ) " & _
"SELECT <CsvSpaltenListe> " & _
"FROM [Dateiname.csv] IN ""X:\CsvOrdner\"" ""TEXT;"" "

Dim Connection As New OleDbConnection( ConnectionString )
Connection.Open()

Dim Command As New OleDbCommand( ImportSql, Connection )
Command.ExecuteNonQuery()

Connection.Close()
Connection.Dispose()



Ggfs. musst Du noch eine schema.ini im CSV Verzeichnis ablegen, wenn Du
in die erste Zeile die Spaltennamen schreibst, müsste es auch so gehen.

Das Format der CSV Datei sàhe dann bspw. so aus:



Zeitpunkt;Messwert
<Datum1>;<Wert1>
<Datum2>;<Wert2>
<Datum3>;<Wert3>



HTH

Tschau, Stefan
Microsoft MVP - Visual Developer ASP/ASP.NET
http://www.asp-solutions.de/ - Consulting, Development
http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

Ähnliche fragen