Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit
GELÖST

Excel XLS - CSV Import in Sql2005

Frage Entwicklung Datenbanken

Mitglied: mischn1980

mischn1980 (Level 2) - Jetzt verbinden

23.05.2008, aktualisiert 29.05.2008, 8138 Aufrufe, 11 Kommentare

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
Mitglied: Biber
24.05.2008 um 18:39 Uhr
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.
01.
OleDbCommand command = new OleDbCommand("SELECT Feld1, feld2, feld3 FROM [" + DATEINAME+ "]", connection); 
02.
connection.Open(); 
03.
 
04.
using (OleDbDataReader reader = command.ExecuteReader()) 
05.
06.
using (SqlBulkCopy bulkCopy = new SqlBulkCopy("Data Source=RECHNERNAME\\SQLEXPRESS;Initial  
07.
Catalog=DATENBANKNAME;Integrated Security=SSPI;")) 
08.
09.
bulkCopy.DestinationTableName = "TABELLENNAME"; 
10.
// ab hier neuer: 
11.
    SqlBulkCopyColumnMapping mapFeld1 = 
12.
    new SqlBulkCopyColumnMapping("Feld1", "ZielFeld1"); 
13.
        bulkCopy.ColumnMappings.Add(mapFeld1); 
14.
 
15.
    SqlBulkCopyColumnMapping mapName = 
16.
        new SqlBulkCopyColumnMapping("Feld2", "ZielFeld2"); 
17.
         bulkCopy.ColumnMappings.Add(mapFeld2); 
18.
 
19.
        SqlBulkCopyColumnMapping mapFeld3 = 
20.
             new SqlBulkCopyColumnMapping("Feld3", "ZielFeld3"); 
21.
         bulkCopy.ColumnMappings.Add(mapFeld3); 
22.
 
23.
 
24.
 
25.
bulkCopy.WriteToServer(reader); 
26.
27.
 
[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
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 08:41 Uhr
Hallo Biber,

vielen Dank schon mal für deine Antwort.

Die Excel-Datei ist nicht so groß aber ich muss rund 3000 importieren.

Die Dateien haben zwischen 30 und 300 Zeilen.

War / Bin der Meinung, dass ich durch den BulkImport Zeit einsparen kann.

Nach dieser Zeile [using (OleDbDataReader reader = command.ExecuteReader())] bekomme ich einen FieldCount von 1.

Hab noch ne weitere Info:



Gruss

Michael
Bitte warten ..
Mitglied: Biber
26.05.2008 um 09:54 Uhr
Moin michael,

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
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 10:09 Uhr
Hi Biber,

ich komm im Moment nicht wirklich drauf was ich da noch schreiben wollte. Ist ein Tel dazwischen gekommen.

Aber zu deiner Frage. Tab ist wirklich der Feldtrenner.
Der Zeilentrenner ist ".

Na ich werd nochmal den con aufbauen und kucken was passiert.

Gruss

Michael
Bitte warten ..
Mitglied: mischn1980
26.05.2008 um 11:58 Uhr
Also ich kann anstellen was ich will.

Bekomm als ColCount immer 1.

Hab den Delimiter nochmal kontrolliert und es ist Tab.

Gruss

Michael
Bitte warten ..
Mitglied: Biber
26.05.2008 um 15:20 Uhr
Moin mischn1980,

hast Du auch "Fmt=Delimited" ohne
"\t" schon probiert?
string con = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + PFAD+ @";Extended
Properties=""text;FMT=Delimited;RMT=""";

Grüße
Biber
Bitte warten ..
Mitglied: mischn1980
27.05.2008 um 09:13 Uhr
Moin,

ja hab ich auch schon versucht.

Das Problem mit dem Trenner ist weg.

Hab im Web noch eine Routine gefunden mit der kann ich alles auslesen.

Dann sind allerdings alle Werte vom Typ String.

Schaffe es im Moment nicht den String in einen Double umzuwandeln.

Bisher hab ich es mit diesem Code versucht:

if (column.DataType == typeof(Double))
{
DataColumn bcol = dtbl.Columns[column.ColumnName];
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"));
}
}

Am Anfang Frag ich ab ob die "Zelle" keinen Inhalt hat und wenn ja soll er 0,00 eintragen. Wenn etwas drinn steht soll es von String in Double umgewandelt werden.

Das geht allerdings noch nicht. Stell mich im Moment an als ob ich noch nie Code geschrieben hab. Naja ist ja auch mein erstes Projekt seit fast 1,5 Jahren.

Gruss

Michael
Bitte warten ..
Mitglied: mischn1980
27.05.2008 um 11:58 Uhr
So ich dreh am Rad.

Bekomm Die Umwandlung nicht wirklich hin.

Kann ich da noch eine Hilfestellung bekommen?

Gruss

Michael
Bitte warten ..
Mitglied: 14695
28.05.2008 um 15:27 Uhr
Hm... an welcher Stelle hakt es denn?
01.
foreach (DataRow row in dtbl.Rows) 
02.
03.
   if (row[bcol].Equals("")) 
04.
     row[bcol] = "0.00"; 
05.
   else 
06.
     row[bcol] = Convert.ToDouble(row[bcol], new  
07.
                     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?
Bitte warten ..
Mitglied: 14695
28.05.2008 um 15:29 Uhr
Hätte bei genauerem Hinsehen auch drauf kommen können. Du sagst, dass alle Spalten vom Typ "String" sind dann kann

01.
   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...
Bitte warten ..
Mitglied: mischn1980
29.05.2008 um 08:55 Uhr
Hallo Leute,

jetzt muss ich mich ersteinmal bedanken.

Eure Hilfe war wirklich extrem gut.

Die Software läuft und alle sind Glücklich.

Der Fehler beim double umwandeln war, dass einige Felder

den Wert "" hatten. Die Coodierung en-GB war auch falsch

musste de-GER sein.

Also dann mal vielen Dank an alle.

Gruss

Michael
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

(1)

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
VB for Applications
gelöst Excel VBA .csv Import in Tabelle x, ab Spalte y

Frage von drimrim zum Thema VB for Applications ...

Datenbanken
gelöst Täglicher Export einer View aus MS SQL 2008 in Excel oder CSV (9)

Frage von Arafat zum Thema Datenbanken ...

VB for Applications
Bestimmte Daten aus eine CSV-Datei in eine Excel-Tabelle importieren (2)

Frage von MariaElena zum Thema VB for Applications ...

Batch & Shell
CSV-Datei nach Excel importieren (5)

Frage von mrvfbnummer2 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (13)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (9)

Frage von StefanT81 zum Thema Windows Server ...