【问题标题】:ADO.NET OleDB and very old dBASE IV fileADO.NET OleDB 和非常旧的 dBASE IV 文件
【发布时间】:2013-03-26 15:01:49
【问题描述】:

我正在以这种方式使用 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”。

有人知道怎么做吗? 谢谢

【问题讨论】:

标签: c# encoding ado.net oledb dbase


【解决方案1】:

好吧,几个小时后,我设法以正确的方式获得了字符串。 诀窍在于将字符串列读取为 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 中的长度。但它有效。希望这对某人也有帮助。

【讨论】:

  • 我应该补充一点,在这个答案中使用了不同的提供者。 CASTing 在“Microsoft.Jet.Oledb.4.0”中不起作用,但在 Visual Fox Pro 提供程序“vfpoledb”中起作用。
【解决方案2】:

您可以在连接字符串中指定区域设置标识符。尝试将连接字符串文本编辑为以下内容:

"Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;"

【讨论】:

    猜你喜欢
    • 2013-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    • 2012-11-18
    • 1970-01-01
    • 2013-07-24
    相关资源
    最近更新 更多