Zapytanie w zapytaniu

Odpowiedz Nowy wątek
2007-01-05 12:23
ziom
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

Pozostało 580 znaków

2007-01-05 21:08
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().


You need to learn how to walk
before you can run

Pozostało 580 znaków

2007-01-08 11:17
ziom
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 ? :/

Pozostało 580 znaków

2007-01-08 19:41
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.


You need to learn how to walk
before you can run

Pozostało 580 znaków

2007-01-11 12:07
Zombi_
0

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

Pozostało 580 znaków

2007-01-12 00:12
0

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


You need to learn how to walk
before you can run

Pozostało 580 znaków

2007-01-21 16:21
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.

Pozostało 580 znaków

2007-01-23 09:20
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.


Pozostało 580 znaków

2007-01-24 00:18
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 :)


You need to learn how to walk
before you can run

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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