У меня есть несколько файлов 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();
}