Excel XLS - CSV Import in Sql2005
Excel XLS / CSV Import in Sql2005
Hallo,
ich haben ein kleines aber für mich im Moment nicht lösbares Problem.
Gegeben ist eine "CSV"-Datei die wie folgt aufgebaut ist:
Ansicht in Excel:
Feld1 [Tab] Feld2 [Tab] Feld3 [Tab] Feld4 [Tab] etc.....
Ansicht in
Im Quellcode ( C# 2008 ) hab ich das im Moment so gelöst:
string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended
Properties=""text;HDR=Yes;FMT=Delimited\t;RMT=""";
using (OleDbConnection connection = new OleDbConnection(con))
{
OleDbCommand command = new OleDbCommand("SELECT * FROM [" + DATEINAME+ "]", connection);
connection.Open();
using (OleDbDataReader reader = command.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial
Catalog=DATENBANKNAME;Integrated Security=SSPI;"))
{
bulkCopy.DestinationTableName = "TABELLENNAME";
bulkCopy.WriteToServer(reader);
}
}
connection.Close();
}
Die Datei wird importiert jedoch werden alle Werte in die erste Spalte geschrieben.
Der Tabulator wird schön als Quadrat angezeigt.
Was mach ich falsch?
Was kann ich noch versuchen?
Bin wirklich um jeden Info dankbar.
Gruss
Michael
Hallo,
ich haben ein kleines aber für mich im Moment nicht lösbares Problem.
Gegeben ist eine "CSV"-Datei die wie folgt aufgebaut ist:
Ansicht in Excel:
Feld1 [Tab] Feld2 [Tab] Feld3 [Tab] Feld4 [Tab] etc.....
Ansicht in
Im Quellcode ( C# 2008 ) hab ich das im Moment so gelöst:
string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended
Properties=""text;HDR=Yes;FMT=Delimited\t;RMT=""";
using (OleDbConnection connection = new OleDbConnection(con))
{
OleDbCommand command = new OleDbCommand("SELECT * FROM [" + DATEINAME+ "]", connection);
connection.Open();
using (OleDbDataReader reader = command.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial
Catalog=DATENBANKNAME;Integrated Security=SSPI;"))
{
bulkCopy.DestinationTableName = "TABELLENNAME";
bulkCopy.WriteToServer(reader);
}
}
connection.Close();
}
Die Datei wird importiert jedoch werden alle Werte in die erste Spalte geschrieben.
Der Tabulator wird schön als Quadrat angezeigt.
Was mach ich falsch?
Was kann ich noch versuchen?
Bin wirklich um jeden Info dankbar.
Gruss
Michael
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 88331
Url: https://administrator.de/forum/excel-xls-csv-import-in-sql2005-88331.html
Ausgedruckt am: 05.04.2025 um 08:04 Uhr
11 Kommentare
Neuester Kommentar
Moin mischn1980,
na ja, Dein Schnipsel works as designed... das wäre die gute Nachricht.
"Bulkcopy" ist ja neudeutsch für "Klumpenkopie"... und der ganze Klump wird eben as is in das erst(best)e Feld reingesemmelt.
Ändere es so, das Deine DB-Engine eine Chance hat, Splaten/Felder zu differenzieren.
[ungetestete Skizze)
P.S. BulkCopy ist zwar ein nettes neues Feature, aber man/frau MUSS es nicht immer nehmen.
Es bringt doch nur dort etwas, wo bei einem satzweisen Schreiben sonst viele Index/Constraint-Prüfungen laufen (würden).
Andererseits kannst Du nur BulkCopys machen (bzw. verantworten), wenn Du vorher den Index DROPst und hinterher neu aufbaust UND auch alle Constraints deaktivierst.
Wat sich auch alles Zeit kosten tut... abgesehen davon, dass Du beim BulkCopy erst hinterher feststellen kannst, ob und was für einen Müll da reingesaugt hast (siehe Deine eigene Beschreibung).
Tipp: Nicht alles benutzen, was neu ist und von M$ als "Feature" bezeichnet wird.
Wie groß ist denn diese XLS-Datei, dass Du ein BulkCopy für sinnhaft gehalten hast?
Grüße
Biber
na ja, Dein Schnipsel works as designed... das wäre die gute Nachricht.
"Bulkcopy" ist ja neudeutsch für "Klumpenkopie"... und der ganze Klump wird eben as is in das erst(best)e Feld reingesemmelt.
Ändere es so, das Deine DB-Engine eine Chance hat, Splaten/Felder zu differenzieren.
OleDbCommand command = new OleDbCommand("SELECT Feld1, feld2, feld3 FROM [" + DATEINAME+ "]", connection);
connection.Open();
using (OleDbDataReader reader = command.ExecuteReader())
{
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial
Catalog=DATENBANKNAME;Integrated Security=SSPI;"))
{
bulkCopy.DestinationTableName = "TABELLENNAME";
// ab hier neuer:
SqlBulkCopyColumnMapping mapFeld1 =
new SqlBulkCopyColumnMapping("Feld1", "ZielFeld1");
bulkCopy.ColumnMappings.Add(mapFeld1);
SqlBulkCopyColumnMapping mapName =
new SqlBulkCopyColumnMapping("Feld2", "ZielFeld2");
bulkCopy.ColumnMappings.Add(mapFeld2);
SqlBulkCopyColumnMapping mapFeld3 =
new SqlBulkCopyColumnMapping("Feld3", "ZielFeld3");
bulkCopy.ColumnMappings.Add(mapFeld3);
bulkCopy.WriteToServer(reader);
}
P.S. BulkCopy ist zwar ein nettes neues Feature, aber man/frau MUSS es nicht immer nehmen.
Es bringt doch nur dort etwas, wo bei einem satzweisen Schreiben sonst viele Index/Constraint-Prüfungen laufen (würden).
Andererseits kannst Du nur BulkCopys machen (bzw. verantworten), wenn Du vorher den Index DROPst und hinterher neu aufbaust UND auch alle Constraints deaktivierst.
Wat sich auch alles Zeit kosten tut... abgesehen davon, dass Du beim BulkCopy erst hinterher feststellen kannst, ob und was für einen Müll da reingesaugt hast (siehe Deine eigene Beschreibung).
Tipp: Nicht alles benutzen, was neu ist und von M$ als "Feature" bezeichnet wird.
Wie groß ist denn diese XLS-Datei, dass Du ein BulkCopy für sinnhaft gehalten hast?
Grüße
Biber
Moin michael,
dann ist der (oder ein weiterer) Fehler hier drin.
P.S. Unter Deinem "Info folgt" seh ich nur meine Rentenprognose...
Grüße
Biber
dann ist der (oder ein weiterer) Fehler hier drin.
string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended Properties=""text;HDR=Yes;FMT=Delimited\t;RMT=""";
- Entweder bist Du mit der Anzahl oder Position der Anführungszeichen durcheinandergekommen
- oder das IMHO merkwürdig aussehende "Fmt=Delimited\t;" wird nicht richtig interpretiert. Schreibt man/frau das laut Doku so im Falle TAB is sich Feldtrenner?
- Und sind auch ganz,ganz sicher TABs drin (nur der Vollständigkeit halber)?
P.S. Unter Deinem "Info folgt" seh ich nur meine Rentenprognose...
Grüße
Biber

Hm... an welcher Stelle hakt es denn?
Wird die foreach-Schleife vollständig durchlaufen? Kommt er über If...Else hinweg? Trägt er Werte in die DR ein? Oder wandelt er nur nicht um?
foreach (DataRow row in dtbl.Rows)
{
if (row[bcol].Equals(""))
row[bcol] = "0.00";
else
row[bcol] = Convert.ToDouble(row[bcol], new
System.Globalization.CultureInfo("en-GB"));
Wird die foreach-Schleife vollständig durchlaufen? Kommt er über If...Else hinweg? Trägt er Werte in die DR ein? Oder wandelt er nur nicht um?

Hätte bei genauerem Hinsehen auch drauf kommen können. Du sagst, dass alle Spalten vom Typ "String" sind dann kann
nie true zurück geben.
Auch kannst du in einer Spalte vom Typ String keinen Wert vom Typ Double ablegen...
If(DataColumn.DataType == typeof(Double))
nie true zurück geben.
Auch kannst du in einer Spalte vom Typ String keinen Wert vom Typ Double ablegen...