[C# 4.0] Odczyt rekordów z bazy DBF

0

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.

0

nie 2 tylko 3 - kolumny są numerowane od 0

0

I radzę również zwolnić połączenie po wykonaniu zadania. np. poprzez użycie using{}

0

@Misiekd - tak wiem o tym, że kolumny numerowane są od zera, natomiast i tak to w tym przypadku nie powoduje żadnej różnicy, ponieważ kolumn jest 24. Dodatkowo, nie zależenie, czy przeglądam 0, czy też 23 kolumnę to przy krotce powyżej 113477 otrzymuje wyżej wspomniany wyjątek;

@Deti - na tą chwilę jest to testowy kod, który będzie częścią większej aplikacji, zatem w optymalizację żadne się nie bawiłem, jakkolwiek, myślę, że w tym przypadku i tak nie ma to znaczenia, bo zadaniem do wykonania jest odczyt wszystkich krotek, zatem całość znajdowała by się w klauzuli using

Co warte jest jeszcze zaznaczenia, to przy wywołaniu GetFieldType() i GetDataTypeName() na obiekcie ExecuteReadera, pętla przechodzi po wszystkich krotkach.

1 użytkowników online, w tym zalogowanych: 0, gości: 1