Správné volání několika příkazů Select   zodpovězená otázka

VB.NET, SQL, Databáze

Chtěl bych se zeptat, jak správně volat několik Selectů z databáze. Zatím to řeším takto:

 Try
            connection.Open()
            Dim cmd As New SqlCommand("Nějaký select", connection)
            Label1.text = cmd.ExecuteScalar

        Finally
            connection.Close()
        End Try

 Try
            connection.Open()
            Dim cmd As New SqlCommand("Nějaký select", connection)
            Label2.text = cmd.ExecuteScalar

        Finally
            connection.Close()
        End Try

Zajímalo by mě, zda je to takto dobře, když mám třeba takových to příkazů několik desítek. Zda to není moc náročný na sever, když furt DB otvírám a zavírám. Dělám to tak správně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Otevírání a zavíraní spojení na DB má určitě nějakou režii, na druhou stranu počet možných současných připojení do DB určitě není neomezený. Takže rada začátečníka zní: pro aplikace, kam může současně přistupovat velké množství klientů spojení zavírat co nejdříve a například u desktopové aplikace pro malý počet klientů to klidně nechávat otevřené a používat po celou dobu jedno připojení. Co na to odborníci?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Rozhodně v žádném případě neudržovat v aplikaci nějaké trvalé globální připojení do databáze. Vždy otevřít spojení jen v případě potřeby nějaké komunikace s databází a uzavřít ho co nejdříve. Ideálně pomocí Using...End Using.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak zase vedle.

Jen se zeptám. Když mám desktopovou aplikaci, kterou provozuji na dvou PC spojených v síti a na jednom z nich je databáze. Proč i v takovémto případě je třeba to spojení neustále otevírat a zavírat, když v celkovém součtu nemohou být nikdy víc než dvě připojení současně?

Děkuji

nahlásit spamnahlásit spam 0 odpovědětodpovědět

To je otázka architektury aplikace. Pokud někdy budete aplikaci nasazovat ve větším počtu, je nejvýhodnější použít mnou navrhované řešení (ono je to výhodné i v malém měřítku jako je váš příklad). Proč zbytečně udržovat stálé spojení s databází když zrovna není potřeba a mohou ho využít ostatní klienti? ADO.NET má tzv. Connection Pool který umožňuje recyklaci ukončeného spojení a tudíž režie na opětovné připojení k serveru SQL je takřka nulová.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Díky za všechny rady :-) Ale jsem teď maximálně zmaten. Ten zápis, co jsem napsal, je správný? Ikdyž tam nemám Using? Používám to v internetové aplikaci, kde se připojuje celkem dost uživatelů a na jedné stránce mám těchto příkazů opravdu hodně. Je to tak správně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Uvádím příklad načtení dat. Podstatné je to, že všechny objekty pro připojení a přístup k databázi používám pouze v momentě kdy je to třeba a všechny jsou explicitně uvolněny pomocí End Using. Nikde není udržováno žádné globální připojení...

Try
  Using connection As New SqlConnection("...")
    Using command As New SqlCommand("SELECT * FROM Publishers")
      Using reader = command.ExecuteReader()
        While reader.Read()
          'Zpracovat data
        End While
      End Using
    End Using
  End Using
Catch ex1 As SqlException
  'Ošetřit chyby související s databází
Catch ex2 As Exception
  'Ošetřit ostatní chyby
End Try
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já osobně bych nechával otevřené connection:

Try
    connection.Open()

    Dim cmd As New SqlCommand("Nějaký select", connection)
    Label1.text = cmd.ExecuteScalar

    Dim cmd2 As New SqlCommand("Nějaký select", connection)
    Label2.text = cmd2.ExecuteScalar

Finally
    connection.Close()
End Try

Případně i Command, pokud příkazů voláte hodně podobných (třeba s identickými parametry):

Try
    connection.Open()

    Dim cmd As New SqlCommand("Nějaký select", connection)
    Label1.text = cmd.ExecuteScalar

    cmd.CommandText = "Nějaký select"
    Label2.text = cmd.ExecuteScalar

    cmd.CommandText = "Nějaký select"
    Label3.text = cmd.ExecuteScalar

    cmd.CommandText = "Nějaký select"
    Label4.text = cmd.ExecuteScalar

Finally
    connection.Close()
End Try
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Myslíte, že je dobré nechávat otevřené connection, ikdyž na stránku přistupuje více lidí současně?

nahlásit spamnahlásit spam 0 odpovědětodpovědět

A ja bych zase volil ulozenou proceduru, vlozil do ni onech nekolik desitek dotazu. pouzil jeden connection zpracoval onech nekolik desitek recordsetu a uzavrel pripojeni.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:  
Heslo:  

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback