サードパーティによって生成されたいくつかの DBF ファイルがあり、それらをクエリできるようにする必要があります。すべての列タイプが文字として定義されているため、問題が発生していますが、これらのフィールドの一部のデータには実際にはバイナリ データが含まれています。OleDbDataReader を文字列または文字配列以外として使用してこれらのフィールドを読み取ろうとすると、InvalidCastException がスローされますが、それらをバイナリ値として読み取るか、読み取った後に少なくともキャスト/変換できる必要があります。 . 実際にテキストを含む列は、期待どおりに返されています。
たとえば、最初の列は長さ 2 バイトの文字フィールドとして定義されていますが、このフィールドには 16 ビット整数が含まれています。
最初の列を読み取って適切なデータ型に変換する次のテスト コードを作成しましたが、値が正しく出力されません。
データベースの最初の行の最初の列の値は 17365 (0x43D5) です。次のコードを実行すると、最終的に 17215 (0x433F) になります。データリーダーによって返された文字列からバイトを取得するためにASCIIエンコーディングを使用する必要があると確信していますが、必要な形式に値を取得する別の方法はわかりません。独自の DBF リーダーを作成し、絶対に必要でない限り、ADO.NET を完全にバイパスします。どんな助けでも大歓迎です。
byte[] c0;
int i0;
string con = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\ASTM;Extended Properties=dBASE III;User ID=Admin;Password=;";
using (OleDbConnection c = new OleDbConnection(con))
{
c.Open();
OleDbCommand cmd = c.CreateCommand();
cmd.CommandText = "SELECT * FROM astm2007";
OleDbDataReader dr = cmd.ExecuteReader();
while (dr.Read())
{
c0 = Encoding.ASCII.GetBytes(dr.GetValue(0).ToString());
i0 = BitConverter.ToInt16(c0, 0);
}
dr.Dispose();
}