我正在以这种方式使用OleDb读取DBF文件:
[TestMethod]
public void TestMethod2()
{
const string path = @"D:\VL816183.DBF";
var connection = new OleDbConnection(string.Format("Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\"", Path.GetDirectoryName(path)));
connection.Open();
var command = new OleDbCommand(string.Format("select MNO from {0}", Path.GetFileName(path)), connection);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var str = (string)reader["MNO"];
}
}
connection.Close();
}
一切似乎都没问题但字符串数据存在问题。源数据库包含用 CodePage = 852 保存的字符串,我找不到正确读取它的方法。
我尝试将CharSet / CodePage / CharacterSet设置为连接字符串的扩展属性,但没有任何运气(事实上,抛出了异常:无法找到可安装的ISAM)。
我也尝试使用'vfpoledb'提供程序阅读它,但仍然没有运气。
例如,字符串为“FRANTIŠEK”,但str变量包含“FRANTIμEK”。
有人知道怎么做吗? 感谢
答案 0 :(得分:3)
好吧,几个小时之后我就设法以正确的方式获得了弦乐。 诀窍是将字符串列读取为varbinary(length):
[TestMethod]
public void TestMethod2()
{
const string path = @"D:\KN_Vzorka_2012\VL816183.DBF";
var connection = new OleDbConnection(string.Format("Provider=vfpoledb;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;", Path.GetDirectoryName(path)));
connection.Open();
var command = new OleDbCommand(string.Format("select cast(MNO as varbinary(20)) as MNO FROM {0}", Path.GetFileName(path)), connection);
using (var reader = command.ExecuteReader())
{
while (reader.Read())
{
var arr = (byte[])reader["MNO"];
var str = Encoding.GetEncoding(852).GetString(arr);
}
}
connection.Close();
}
唯一的问题是varbinary CAST内部的长度。但它的确有效。希望这对某人也有帮助。
答案 1 :(得分:1)
您可以在连接字符串中指定区域设置标识符。尝试将连接字符串文本编辑为以下内容:
"Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;"