3

私はこのように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」が含まれています。

誰かがそれを行う方法を知っていますか?ありがとう

4

2 に答える 2

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();
}

唯一の問題は、varbinaryCAST内の長さです。しかし、それは機能します。これが誰かにも役立つことを願っています。

于 2013-03-27T06:28:52.097 に答える
1

接続文字列でロケール識別子を指定できます。接続文字列のテキストを次のように編集してみてください。

"Provider=Microsoft.Jet.Oledb.4.0;Data Source={0};Extended Properties=\"dBase IV\";Locale Identifier=852;"
于 2013-03-26T15:26:35.330 に答える