forgottenrealm
Goto Top

Import von CSV zu MySQL mit VB.NET

Guten Tag!


Ich versuche für ein kleines Projekt, eine CSV Datei mit VB.net in eine MySQL Datenbank einzubinden.

Mein Programmcode sieht bisher so aus ..

Dim TV_Tabelle As String
TV_Tabelle = "C:\Tabelle.csv"  

Dim con As New MySqlConnection
Dim cmd As New MySqlCommand

con.ConnectionString = "server=" & Public_DBServerAdresse & ";uid=" & Public_DBServerClient & ";pwd=" & Public_DBServerPasswort & ";database=" & Public_DBServerDatenbank & ";port=" & Public_DBServerPort  

cmd.Connection = con


cmd.CommandText = "LOAD DATA LOCAL INFILE '" & TV_Tabelle & "' INTO TABLE " & GetFileName(TV_Tabelle) & " FIELDS TERMINATED BY ';'"  

'cmd.CommandText = "CREATE TABLE" & MySpace & GetFileName(TV_Tabelle) & MySpace & "(Client VARCHAR(50))"  

Try

	con.Open()

	cmd.ExecuteNonQuery()

	con.Close()

Catch ex As Exception



	MsgBox(ex.Message)

End Try

Die Tabelle wird einmal durch den auskommentierten CommandText erstellt, aber beim Aufruf mit der LOAD DATA ... Zeile läuft das Programm einige Zeit und bricht dann mit dem Fehler "Fatal error encountered attempting to read the resultset." ab. Damit kann ich leider gar nichts anfangen und ich steh, was die Fehlersuche angeht, absolut auf dem Schlauch.

Auch wenn ich versuche, die CSV Datei in eine Tabelle zu importieren, in der ich diese zuvor von Hand über phpmyadmin eingebunden habe, kommt diese Fehlermeldung.

Liegt der Fehler am CommandText oder wo?

Freundliche Grüße face-smile

Content-ID: 214025

Url: https://administrator.de/contentid/214025

Ausgedruckt am: 04.12.2024 um 08:12 Uhr

colinardo
colinardo 12.08.2013 aktualisiert um 12:01:35 Uhr
Goto Top
Hallo ForgottenRealm,
probiers mal mit
cmd.CommandText = "LOAD DATA LOCAL INFILE '" & TV_Tabelle.Replace("\","/") & "' INTO TABLE " & GetFileName(TV_Tabelle) & " FIELDS TERMINATED BY ';' LINES TERMINATED BY '\n'"   
kann auch sein das du LINES TERMINATED BY '\n' noch in LINES TERMINATED BY '\r\n' ändern musst.

eventuell musst die LOAD DATA LOCAL Funktion in der MySQL-Konfiguration erst noch freischalten:
http://stackoverflow.com/questions/10762239/enable-load-data-local-infi ...

Grüße Uwe
ForgottenRealm
ForgottenRealm 12.08.2013 um 12:43:51 Uhr
Goto Top
Hallo colinardo,

vielen Dank für die schnelle Antwort!

Mit dem CommandText ging es direkt, ich denke mal der Fehler war das "\" statt "/" Zeichen face-smile

Der Import funktioniert klasse, allerdings habe ich jetzt noch das Problem, das beim Import die Feldnamen nicht mit übernommen werden.

Die Tabelle wurde von mir einmal erstellt, mit dem Feld "Clients", weitere Felder habe ich allerdings so nicht angelegt.

Gibt es eine einfache Möglichkeit, im CommandText anzugeben, dass nicht vorhandene Felder erstellt werden?

Ich muss leider gestehen, dass ich mich mit den SQL Commands nur sehr wenig auskenne face-smile

Alternativ kann ich mir auch eine Funktion erstellen, mit der ich die Feldnamen aus meiner CSV Tabelle auslese und die Tabelle auf dem MySQL Server vor dem Import mit allen benötigten Feldern erstelle.

Grüße face-smile
colinardo
colinardo 12.08.2013 um 13:14:53 Uhr
Goto Top
Bin jetzt auch nicht so im Thema drin, aber die Überschriftenzeile kannst mit IGNORE 1 LINES zusätzlich im Command überspringen, um nur die Daten zu importieren.
Schau dir mal folgendes PDF zu dem Thema an.
Grüße Uwe
ForgottenRealm
ForgottenRealm 12.08.2013 um 15:38:31 Uhr
Goto Top
Ich schau mir das mal an, vielen Dank !
ForgottenRealm
ForgottenRealm 13.08.2013 um 15:11:56 Uhr
Goto Top
Moin face-smile

wie es scheint gibt es doch noch ein Problem ...

In einem Feld importiere ich einen Windows Dateipfad, aus diesem entfernt der Import allerdings sämtliche \ Zeichen.

Importiere ich die CSV Datei von Hand über PHPMyAdmin, so wird die Datei korrekt eingelesen.

Ich habs auch schonmal mit ENCLOSED BY ‘’ ESCAPED BY '' versucht, was mir aber nur einen Syntax Error gibt
colinardo
colinardo 14.08.2013 um 09:42:20 Uhr
Goto Top
Steht alles sehr gut erklärt in der Doku:
http://dev.mysql.com/doc/refman/5.1/de/load-data.html
kurzer Auszug:
Der Backslash wird bei MySQL als Escape-Zeichen in Strings verwendet. Insofern müssen Sie, um FIELDS ESCAPED BY '\\' zu schreiben, zwei Backslashes angeben, damit der Wert als ein Backslash interpretiert wird. 

Grüße Uwe
ForgottenRealm
ForgottenRealm 14.08.2013 um 11:23:43 Uhr
Goto Top
Moin face-smile

Mein CommandText sieht nun so aus

cmd.CommandText = "LOAD DATA LOCAL INFILE '" & TV_Tabelle.Replace("\", "/") & "' INTO TABLE " & GetFileName(TV_Tabelle) & " FIELDS TERMINATED BY ';' ENCLOSED BY '' ESCAPED BY '\\' IGNORE 1 LINES"  

Mit '\\' hatte ich es auch schon probiert, allerdings ohne Erfolg. Das Feld mit dem Windows Pfad enthält nach wie vor keine \.

Grüße face-smile
colinardo
colinardo 14.08.2013 aktualisiert um 11:41:25 Uhr
Goto Top
das meinte ich damit nicht, meinte damit das du in dem csv-File alle Backslash's mit Suchen und Ersetzen verdoppelst.
Normalerweise sollte ESCAPED BY '' aber funktionieren.
Auszug aus der Doku:
If the FIELDS ESCAPED BY character is empty, escape-sequence interpretation does not occur. 
kann es hier leider momentan nicht testen. Könnte natürlich sein das der MySQL-Interpreter für .Net das anders interpretiert. Muss ich später noch mal genauer nachsehen.
Grüße Uwe
colinardo
colinardo 14.08.2013 aktualisiert um 11:53:58 Uhr
Goto Top
du kannst mal versuchen ob es mit ESCAPED BY '\N' funktioniert ...wichtig ist das große "N"

habe ich noch gefunden:
A NULL value indicates the absence of a value or an unknown value, which is difficult to represent literally in a data file. For import and export purposes, MySQL use the convention of representing NULL by \N. For LOAD DATA INFILE, a \N appearing unquoted by itself as a column value is interpreted as NULL. MySQL users sometimes assume that an empty value in an input file will be handled as a NULL value, but that isn't true. For SELECT … INTO OUTFILE, MySQL writes NULL values to the output file as \N.
ForgottenRealm
ForgottenRealm 14.08.2013 um 12:34:06 Uhr
Goto Top
Hallo Uwe

ich glaube, ich habs mehr oder wenige durch einen Zufall rausbekommen.

Beim Import über phpmyadmin sind die Felder für ENCLOSED und ESCAPED mit einem Zeichen gefüllt, was ich bisher nie geändert habe. Die einzige Anpassung die ich vorgenommen hatte war, das Trennzeichen zu ändern und der Import (von Hand wohl gemerkt) ging wunderbar.

Ich dachte, in den Feldern seien zwei ' zu sehen, dies war allerdings ein ".

Dieses Zeichen habe ich statt den\\ in die ESCAPED BY ' " ' Regel eingebunden und siehe da, es funktioniert alles face-smile

Deswegen ging wohl auch der Import von Hand immer, da dort richtigerweise ein " drin stand.

Vielen Dank auf jeden Fall für deine Hilfe !

Grüße