Witam,
posiadam pewien problem związany z odczytem rekordów z plikowej bazy danych DBF.
Moja funkcja:
static void OpenDBF()
{
string connectionString = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\Baza;Extended Properties=dBASE IV;";
string command = "select * from BAZA.DBF";
var dbConnection = new OleDbConnection(connectionString);
dbConnection.Open();
var a = dbConnection.CreateCommand();
a.CommandText = command;
var b = a.ExecuteReader();
// TA PĘTLA ZWRACA MI PRAWIDŁOWO WSZYSTKIE NAZWY KOLUMN WE WSKAZANYM DBF
for (int i = 0; i < b.FieldCount; i++)
{
Console.WriteLine(b.GetName(i));
}
// TA PĘTLA POWINNA MI ZWRÓCIĆ Z KAŻDEJ KROTKI (WIERSZA) ATRYBUT (KOLUMNĘ) NR 2
// JEDNAK TEGO NIE ROBI
while (b.Read())
{
b.GetString(2);
}
}
Pierwsza pętla prawidłowo zwraca mi nazwy kolumn pobrane ze wskazanego w ConnectionStringu DBF.
Druga pętla powinna mi zwrócić z każdego wiersza kolumnę nr 2, niestety powyżej 113477 krotki VS2010 zwraca mi wyjątek: OleDbException was unhandled Rekord jest usunięty. W żadnym rekordzie nie znaleziono klucz wyszukiwania.
Jeżeli zamiast drugiej pętli użyję takiej:
int count = 0;
while (b.Read())
{
count++;
}
Wykona się ona prawidłowo, dodatkowo wiem, że przechodzi ona po wszystkich krotkach, ponieważ zmienna count w ostatniej iteracji zawiera wartość równą licznie wszystkich wierszy znajdujących się w bazie DBF.
Dodam, że baza zawiera prawie 300 tys krotek, plik zajmuje fizycznie ok 150 MB.
Jak prawidłowo odczytywać wiersze ?
Pozdrawiam :)
EDIT:
Co warte jest jeszcze zaznaczenia, to przy wywołaniu GetFieldType() i GetDataTypeName() na obiekcie ExecuteReadera, pętla przechodzi po wszystkich krotkach.