2009-07-03 13 views
0

Ich arbeite an einem einfachen Windows-Dienst, der CSV-Daten liest und die Daten auf MS-SQL-Server überträgt. Csv enthält Nicht-Unicode-Zeichen (Ççşşııööüüğ). ODBC überträgt das richtige Endocing nicht. Ich versuche die Kopie Daten ohne ODBC, mit Text lesen, Codierung nicht richtig. Aber die Textcodierung ist richtig, wenn ich den Dienst debugge. Csv las Code:Windows-Dienst nicht-Unicode-Codierung Problem

string[] csvLines = File.ReadAllLines(csvFile, Encoding.GetEncoding(new System.Globalization.CultureInfo("tr-TR").TextInfo.ANSICodePage)); 

Dienst als Localsystem läuft und ich kann nicht "System Locale" für Nicht-Unicode-Programme ändern, ich habe Systemgebietsschema zu verwenden, wie United States (English)

Antwort

0

Aus dem Gedächtnis Wenn Sie eine neue Kultur auf die Art und Weise erstellen, wie Sie es tun, werden Systemstandards verwendet (in Ihrem Fall "en-US").

Also, anstatt eine neue CultureInfo verwenden Erstellen der pre-cached ein:

CultureInfo.GetCultureInfo("tr-TR") 

Es funktioniert, wenn Sie debuggen, da der Code, wie Sie ausgeführt wird, nicht Localsystem, und ich nehme Ihre locale Türkisch ist.


Edit: Hoppla, sollte GetCultureInfo statt GetCulture gewesen.

Dies funktioniert auf meinem Rechner in einer Konsole App:

Console.WriteLine("en-US: {0}", 
     CultureInfo.GetCultureInfo("en-US").TextInfo.ANSICodePage); 
Console.WriteLine("tr-TR: {0}", 
     CultureInfo.GetCultureInfo("tr-TR").TextInfo.ANSICodePage); 

Ausgänge 1252 und 1254.

+0

Ich habe auch versucht "CultureInfo.GetCulture (" tr-TR ")" aber es funktioniert nicht :(Haben Sie noch eine andere Idee? – Murat

+0

Ein weiterer Gedanke: wenn die Datei auch mit UTF-8 kodiert sein könnte, Verwenden Sie StreamReader.ReadLine und verwenden Sie die StreamReader-Konstruktorversion mit dem Parameter detectEncodingFromByteOrderMarks, der auf true festgelegt ist. – devstuff

+0

Dateicodierung ist ANSI. detectEncodingFromByteOrderMarks funktioniert nicht – Murat

0

Die Datei lesen Code sieht gut aus und ich glaube, das Problem besteht darin, wie Sie die ODBC-Funktion aufrufen. Es sieht so aus, als ob die Codierungsinformationen irgendwo zwischen den Anrufen verloren gehen.

Können Sie ein Code-Snippet mit Ihren ODBC-Anrufen posten? Danke

+0

ConnStr = "Treiber = {Microsoft Text Driver (* .txt; * .csv)} ; Dbq = D: \ some_dic \; Erweiterungen = asc, csv, tab, txt; Persist Sicherheitsinformation = False " OdbcConnection Quelle = neu OdbcConnection (ConnStr); Zeichenfolge sql =" SELECT * FROM [data.csv] "; OdbcCommand command = new OdbcCommand (sql, Quelle); source.Open(); OdbcDataAdapter adp = neuer OdbcDataAdapter (Befehl); DataTable tblRecords = new DataTable(); adp.Fill (tblRecords); – Murat

+0

Sorry, ich habe übersehen, dass Sie ODBC zum Lesen von Ihrer CSV-Datei verwenden, nicht in ms-sql schreiben. Ich wollte nach dem Code fragen, der tatsächlich in ms-sql geschrieben wird, da ich glaube, dass hier das Problem liegt. Es sieht so aus, als ob Sie CSV-Daten lesen, aber auf der anderen Seite - in der ms-sql-Tabelle - ist die Codierung falsch, oder? Vielen Dank. – Lurkeroid

+0

(habe Ihren Kommentar unten in einer anderen Antwort gesehen) Wenn die Datei ANSI ist und nicht ASCII-Zeichen enthält (ich wette, Sie meinten Nicht-ASCII, nicht Nicht-Unicode in Ihrem ursprünglichen Beitrag, da technisch keine Nicht-Unicod-Zeichen vorhanden sind) , dann benötigen Sie die Codepage, mit der die Datei codiert ist, andernfalls ist Ihre Datei nur eine Folge von Bytes. – Lurkeroid