2010-06-24 3 views
6

ich einen komplexen Import in einem Microsoft SQL Server 2000Wie das Trennzeichen angeben, wenn CSV-Dateien über OLEDB in C# importiert

Da es in einem DTS tut, ist zu kompliziert ausführen müssen, ich versuche zu tun es mit einem kleinen C# -Programm, aber ich habe Probleme, wenn ich eine CSV-Datei importieren muss: Diese Datei verwendet Semikolons als Feldtrennzeichen anstelle von Kommas und ich kann nicht den .NET OLE DB-Provider, um es zu erkennen.

Ich habe bereits verschiedene "Lösungen" im Netz gefunden wie Extended Properties="Text; Format=Delimited" oder `` Erweiterte Eigenschaften = "Text; Format = Getrennt (;)" in the connection string or using a schema.ini` Datei ohne Erfolg.

Dies ist der eigentliche Code Ich verwende:

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text;HDR=Yes;Format=Delimited\"")) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select [Field 1], [Field 2] from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 

using (SqlConnection Connection = new SqlConnection("Data Source=server; Initial Catalog=database; User Id=user; Password=password;")) 
{ 
    Connection.Open(); 

    using (SqlCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "insert into [table] ([field_1], [field_2], ...) values (@field_1, @field_2, ...)"; 

     Command.Parameters.Add("field_1", SqlDbType.Date, 0, "Field 1"); 
     Command.Parameters.Add("field_2", SqlDbType.VarChar, 100, "Field 2"); 
     ... 

     using (SqlDataAdapter Adapter = new SqlDataAdapter()) 
     { 
      Adapter.InsertCommand = Command; 

      Adapter.Update(Table); 
     } 
    } 
} 

Alle Ideen, wie mit dem Semikolon als Feldtrennzeichen zu erreichen externen libriaries ohne sie?

Hinweise:

  1. Die „ohne auf externe libriaries zu verlassen“ Bit ist, weil ich die Datei direkt in die Datenbank und keine Bibliothek, die ich gefunden importieren muß, kann dies tun (sie Strings zurück), und unsere PHB wird nicht einmal einen Cent für eine kommerzielle Lösung fallen lassen.
  2. Ich weiß, dass ich die Datei über eine DTS importieren kann, aber ich muss komplexe Verzweigungen in den Workflow- und Dateiänderungen vor und nach dem Import durchführen, und das würde dazu führen, dass ich in die DTS hinein- und wieder herausspringe.
  3. Alles in der DTS zu tun wäre nicht praktisch für mich, wie ich bin nicht so erfahren in ActiveX und VBScript-Codierung.

Vielen Dank im Voraus, Andrea.

Edit 1 - @andyb: Test-Programmcode für schema.ini Ansatz:

String ConnectionString = String.Format("Provider=Microsoft.Jet.OLEDB.4.0; Data Source={0}; Extended Properties=\"Text\"", Environment.CurrentDirectory); 

DataTable Table = new DataTable(); 

using (OleDbConnection Connection = new OleDbConnection(ConnectionString)) 
{ 
    Connection.Open(); 

    using (OleDbCommand Command = Connection.CreateCommand()) 
    { 
     Command.CommandText = "select * from [file.csv]"; 

     using (OleDbDataAdapter Adapter = new OleDbDataAdapter(Command)) 
     { 
      Adapter.Fill(Table); 
     } 
    } 
} 
+0

Ihr Code verwendet SQL-Provider-Syntax für die OleDbConnection-Zeichenfolge und OLE DB-Provider-Syntax innerhalb der SqlConnection Zeichenfolge.Könnte dies das Problem sein? –

+0

@ Panagiotis Kanavos: Ausschneiden und Einfügen Fehler, korrigiert. – Albireo

Antwort

12

Commenter ist richtig, dass Sie Ihren Provider Syntax falsch herum haben.

Dies ist jedoch nicht das Problem. Leider können Sie in Ihrer oledb-Verbindungszeichenfolge kein benutzerdefiniertes Trennzeichen angeben. Erstellen Sie stattdessen eine schema.ini-Datei im selben Verzeichnis wie die Quelldatei mit folgendem Inhalt:

[file.csv] 
Format=Delimited(;) 

Clumsy, aber es funktioniert.

+0

Hallo, ich habe schon versucht den 'schema.ini' Ansatz, aber es funktioniert nicht, ich bekomme immer noch die eine Spalte importieren. Sie können den Code, den ich in einem neuen Testprogramm verwendet habe, im Text der bearbeiteten Frage finden. – Albireo

+0

Ich habe nur Ihren Code kopiert und die DataTable abgefragt und es funktioniert immer noch für mich. Entschuldigen Sie die Frage, aber Sie haben den korrekten Dateinamen in schema.ini? – andyb

+0

Ja, ich habe es zweimal überprüft und es ist in Ordnung. Könnte es sein, dass etwas das stört? : \ – Albireo

5

Die Datei schema.ini muss in Unicode oder ANSI gespeichert werden, nicht als UTF-8.

Ihre Datendatei muss auch als Unicode nicht UTF-8 gespeichert werden.

1

Sie haben Ihre CSV-Datei Namen in der Datei schema.ini (nicht [file.csv] zu schreiben, zum Beispiel: test.csv eine schema.ini hat mit [test.csv] Text in Zeile 0:

[test.csv] 
Format=Delimited(;) 
Verwandte Themen