Zapytanie w zapytaniu

0

Witam.

Dopiero co zacząłem "bawić się" połączeniami z DB i natknąłem się na taki problemik.

Tworzę połączenie i obiekt:

SqlCommand cmd_GeoPol = new SqlCommand(sql, conn);
            DbDataReader rdr_GeoPol;

następnie

rdr_GeoPol = cmd_GeoPol.ExecuteReader(CommandBehavior.CloseConnection);

i później mam pętlę wewnątrz której chciałbym kolejne zapytanie

            flaga = false;
            while (rdr_GeoPol.Read())
            {
                if (flaga)
                {
                }
                else
                {
                    string sprUpr = "SELECT Grant_app, ID_app FROM app_users WHERE ID_app = '" + rdr_GeoPol["ID_app"] + "'";                    
                    SqlCommand comm_sprUpr = new SqlCommand(sprUpr, conn);
                    DbDataReader rdr_sprUpr;
                    rdr_sprUpr = comm_sprUpr.ExecuteReader(CommandBehavior.CloseConnection); // <--- tu jest blad
                    rdr_sprUpr.Read();
                    Grant_app = Convert.ToBoolean(rdr_sprUpr["Grant_app"]);
                    rdr_sprUpr.Close();
                    if (Grant_app)
                    {
                        flaga = true;
                        wybranePole = Convert.ToString(rdr_GeoPol["variant"]);
                    }
                }

w tym miejscu które zaznaczyłem pojawia się komunikat, że nie mogę otworzyć kolejnego DataReader'a ponieważ nie zamknąłem tego pierwszego.

Będę bardzo wdzięczny za wskazówki

0

Krotko mowiac na raz moze byc otwarty tylko jeden DataReader. Po zakonczeniu dajesz dataReader.Close() i dopiero wtedy mozesz wykonac miedzy innymi SqlCommand.ExecuteReader().

0

A mógłby mi ktoś napisać co w takim razie należało by zastosować w takiej sytuacji ?
Kiedy potrzebuję wysłać jedno zapytanie do bazy i na podstawie odczytywanie kolejnych wierszów wywoływać inne ?

DataSet ? :/

0

Nie jestem pewien czy DataSet nie ma takiego ograniczenia - ogolnie nie lubie z niego korzystac, bo niewygodny jest. Ja zazwyczaj w takiej sytuacji zmieniam zapytanie tak, by dostac wszystko w jednym. W ostatecznosci wrzucam pierwszy wynik do listy/tablicy i wykonuje drugie.

0

Wystarczy założyć drugi obiekt SqlConnection i podać do drugiego zapytania i nie trzeba będzie zamykać pierwdzego DataReadera

0

Niby tak, ale tworzenie dwoch osobnych polaczen to IMHO srednio optymalne rozwiazanie.

0

spokojnie użyj dataset, dane bedizesz miał w pamięci a SqlConnection przekazuj kolejne zapytania, sam kożystałem z takiego rozwiązania swietnie się sprawdza.

0

Proponuję skorzystać z zapytań zagnieżdżonych. Wtedy nie będzie potrzeby bawienia się w kodowanie połączenia, wystarczy odpowiednio napisać zapytanie, np. podam przykład abstrakcyjny :

select first_name, last_name from users where id in (select id from accounts where active='true')

Zapytanie to najpierw pobiera identyfikatory użytkowników których konta są aktywne, a następnie na podstawie uzyskanych wyników wykonywane jest "zewnętrzne" zapytanie. Nie wiem czy o to ci chodziło, ale ja przeważnie z takiego łączenia zapytań korzystam, dodam że przenosisz wtedy obliczenia związane z wyszukiwaniem do serwera SQl, a te są już pod tym względem odpowiednio zoptymalizowane.

0

Ja zazwyczaj uzywam join'ow lub zagniezdzonych - zwalanie obliczen na serwer zazwyczaj jest najlepszym pomyslem, bo na 99% jest bardziej optymalny od naszej aplikacji :)

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