Przeglądanie bazy SQLITE

0

To jest funkcja podpieta pod button "poprzednie". Ma ona wyświetlać(po kliknieciu) po kolei poprzednie rekordy z bazy danych, począwszy od jakiejś wczytanej.

int liczbaint = Convert.ToInt32(textBox4id.Text); //konwersja id rekordu wczytanego
            for (int i = 1; i <= liczbaint; i++)
            {
                liczbaint = liczbaint - i;
                sql_cmd.Parameters.Add(new SQLiteParameter("@id2", liczbaint));
                sql_cmd.CommandText = "SELECT nazwa,kod_kreskowy FROM towary WHERE id=@id2;";

                SQLiteDataReader wynik = sql_cmd.ExecuteReader();

                while (wynik.Read())
                {
                    textBox1nazwa.Text = wynik.GetString(0);
                    textBox2kod.Text = wynik.GetString(1);
                }

                laczkarozlaczka.Rozlacz();

            } 

Niestety funkcja wyrzuca błąd:

An unhandled exception of type 'System.InvalidOperationException' occurred in System.Data.SQLite.dll

Additional information: DataReader already active on this command

Co może być nie tak?

dodanie znacznika <code> dla treści błędu - @furious programming

1

W której linii wywala błąd?
Czemu robisz to w pętli i odpytujesz bazę wiele razy zamiast jednym zapytaniem where id<liczbaint.
To:

for (int i = 1; i <= liczbaint; i++)
            {
                liczbaint = liczbaint - i;

możesz zamienić na for (liczbaint; 1 <= liczbaint; liczbaint--)
Do tego pętla wykonuje się wiele razy i cały czas nadpisujesz te same textboxy.

0

np. samo to:

            int liczbaint = Convert.ToInt32(textBox4id.Text); //wczytany rekord
            sql_cmd.Parameters.Add(new SQLiteParameter("@id2", liczbaint));
            sql_cmd.CommandText = "SELECT nazwa,kod_kreskowy FROM towary WHERE id<@id2;"; //wyswietlenie poprzedniego

                SQLiteDataReader wynik = sql_cmd.ExecuteReader();

                while (wynik.Read())
                {
                    textBox1nazwa.Text = wynik.GetString(0);
                    textBox2kod.Text = wynik.GetString(1);
                }

 

wyświetla mi poprzedni rekord w bazie, teraz tylko problem, żeby po nastepnym kliknieciu wyświetliło mi kolejny poprzedni rekord i po nastepnym kliknieciu znowu. ma ktoś jakiś pomysł?

1

Pobieranie poprzedniego id to głupi pomysł ponieważ poprzednie id może nie istnieć.
Zamiast tego trzeba pobrać rekordy z id mniejszym niż aktualny rekord. Posortować malejąco względem kolumny id i pobrać pierwszy element.
Teraz kierunek google i dowiedz się jak napisać takie zapytanie :P

0
 sql_cmd.Parameters.Add(new SQLiteParameter("@id2", liczbaint));
            sql_cmd.CommandText = "SELECT nazwa,kod_kreskowy,id FROM towary WHERE id<@id2 ORDER BY id asc;";

            SQLiteDataReader wynik = sql_cmd.ExecuteReader();

            while (wynik.Read())
            {
                textBox1nazwa.Text = wynik.GetString(0);
                textBox2kod.Text = wynik.GetString(1);
            }

zrobilem jak napisałeś, pobiera mi poprzedni rekord, teraz tylko problem, żeby po nastepnym kliknieciu pobrał poprzedni, np wczytalem na poczatku id=5, klik i wyswietla mi id=4, klik i id=3, klik i id=2...

2

Pobierasz z bazy wszystkie elementy mniejsze od id iterujesz po każdym i zatrzymujesz się na ostatnim, to jest złe rozwiązanie. Zmień końcówkę zapytania na
ORDER BY id desc limit 1; to pobierze tylko 1 rekord.

Co do pytania, zapamiętaj gdzieś id pobranego rekordu, wyciągasz to z bazy ale nic z tym nie robisz. Później tylko przekażesz do metody pobierającej poprzedni rekord, ten aktualny.

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