[C#] 用不同的機器上的dBase III .dbf文件編碼問題


Answers

試試這個代碼。

var oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = "Driver={Microsoft Visual FoxPro Driver};SourceType=DBF;SourceDB=" + dbPath;
oConn.Open();
var oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";
var reader = oCmd.ExecuteReader();
reader.Read(); 
byte[] A = Encoding.GetEncoding(Encoding.Default.CodePage).GetBytes(reader.GetString(0));
string p = Encoding.Unicode.GetString((Encoding.Convert(Encoding.GetEncoding(850), Encoding.Unicode, A)));
Question

我正在使用C#和.NET 3.5,嘗試使用Microsoft dBase Driver使用ODBC從舊的dbf文件導入一些數據。

dbf採用dBase III格式,使用ibm850編碼字符串。

現在,當我在我的機器上運行我的程序時,從OdbcDataReader讀取的所有字符串數據都會轉換為UTF-16或UTF-8或其他東西,我將它保存為UTF-8,一切正常,但是當我嘗試在XP上使用這個程序,有些字符不能正確轉換為UTF-8。 例如“Õ”。 也可能有一些其他的。 “Ä”,“Ö”和“Ü”等字符都可以。 這就是問題。 也許ODBC或驅動程序使用一些機器文化信息或東西搞砸了一切。

是否有可能從數據庫讀取字符串為二進制? 也許一些函數像CONVERT或CAST? 或者我在哪裡可以找到一些SQL函數和語法適用於這個dBase驅動程序或其他驅動程序的參考? 我四處搜尋,找不到任何東西。 使用ODBC和SQL時,我感到很盲目。

現在我正在用一個臨時的黑客來代替所有的σ。

謝謝!

示例代碼:

System.Data.Odbc.OdbcConnection oConn = new System.Data.Odbc.OdbcConnection();
oConn.ConnectionString = @"Driver={Microsoft dBase Driver (*.dbf)};DriverID=277;Dbq=" + dbPath + ";";
oConn.Open();

System.Data.Odbc.OdbcCommand oCmd = oConn.CreateCommand();
oCmd.CommandText = @"SELECT name FROM " + dbPath + "TABLE.DBF";

System.Data.Odbc.OdbcDataReader reader = oCmd.ExecuteReader();
reader.Read();

byte[] buf = Encoding.UTF8.GetBytes(reader.GetString(0));
BinaryWriter writer = new BinaryWriter(File.Open(@"C:\DBF\Test.txt", FileMode.Create));
writer.Write(buf);

結果:

E5在dbf(Õ在850)

pc1上的Test.txt:C3 95(UTF-8中的Õ)

pc2上的Test.txt:CF 83(UTF-8中的σ)




你有沒有嘗試使用Visual FoxPro驅動程序“VFPOleDb”驅動程序?