2012-09-19 13 views
8

Weźmy następujący przykład ...SqlCommand (using/Utylizacja problem)

 Using cn As New SqlConnection(ConnectionString) 
      Try 
       Dim cmd As SqlCommand = New SqlCommand 
       With cmd 
        .Connection = cn 
        .Connection.Open() 
        .CommandText = "dbo.GetCustomerByID" 
        .CommandType = CommandType.StoredProcedure 
        .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
        .Parameters("@CustomerID").Value = CustomerID 
       End With 

       da = New SqlDataAdapter(cmd) 
       da.Fill(ds, "Customer") 
      Catch ex As Exception 

      End Try 
     End Using 

z moich badań jest dziś brzmi tak, jakby to jest w zasadzie w porządku, ale SqlCommand nie jest usuwany.

Pytanie -> Który z poniższych przykładów jest najlepszym sposobem radzenia sobie z tym?

Przykład 2 - usuwać ręcznie

 Using cn As New SqlConnection(ConnectionString) 
      Try 
       Dim cmd As SqlCommand = New SqlCommand 
       With cmd 
        .Connection = cn 
        .Connection.Open() 
        .CommandText = "dbo.GetCustomerByID" 
        .CommandType = CommandType.StoredProcedure 
        .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
        .Parameters("@CustomerID").Value = CustomerID 
       End With 

       da = New SqlDataAdapter(cmd) 
       cmd.Dispose() 
       da.Fill(ds, "Customer") 
      Catch ex As Exception 

      End Try 
     End Using 

Przykład 3 - automatycznego usuwania ze using

 Using cn As New SqlConnection(ConnectionString) 
      Try 
       Using cmd As New SqlCommand 
        With cmd 
         .Connection = cn 
         .Connection.Open() 
         .CommandText = "dbo.GetCustomerByID" 
         .CommandType = CommandType.StoredProcedure 
         .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
         .Parameters("@CustomerID").Value = CustomerID 
        End With 

        da = New SqlDataAdapter(cmd) 
        da.Fill(ds, "Customer") 
       End Using 
      Catch ex As Exception 

      End Try 
     End Using 

Przykład 4 - taki sam jak w przykładzie 3, lecz try/zapadka jest obrębie Stosując - czy to robi różnicę?

 Using cn As New SqlConnection(ConnectionString) 
      Using cmd As New SqlCommand 
       Try 
        With cmd 
         .Connection = cn 
         .Connection.Open() 
         .CommandText = "dbo.GetCustomerByID" 
         .CommandType = CommandType.StoredProcedure 
         .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
         .Parameters("@CustomerID").Value = CustomerID 
        End With 

        da = New SqlDataAdapter(cmd) 
        da.Fill(ds, "Customer") 
       Catch ex As Exception 

       End Try 
      End Using 
     End Using 

Przykład 5 - Tak samo jak w przykładzie 4, ale tekst CommandText i cn są określone w Oświadczeniu o korzystaniu - Jakie są tego zalety?

 Using cn As New SqlConnection(ConnectionString) 
      Using cmd As New SqlCommand("GetCustomerByID", cn) 
       Try 
        With cmd 
         .Connection.Open() 
         .CommandType = CommandType.StoredProcedure 
         .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
         .Parameters("@CustomerID").Value = CustomerID 
        End With 

        da = New SqlDataAdapter(cmd) 
        da.Fill(ds, "Customer") 
       Catch ex As Exception 

       End Try 
      End Using 
     End Using 

Przykład 6 - taki sam jak przykład 5, ale połączenie jest otwarte na cn zamiast cmd. Czy lepiej jest otworzyć połączenie na cmd, jeśli ma być wykonana tylko jedna procedura składowana?

 Using cn As New SqlConnection(ConnectionString) 
      cn.Open() 

      Using cmd As New SqlCommand("GetCustomerByID", cn) 
       Try 
        With cmd 
         .Connection = cn 
         .CommandType = CommandType.StoredProcedure 
         .Parameters.Add("@CustomerID", SqlDbType.Int, 4) 
         .Parameters("@CustomerID").Value = CustomerID 
        End With 

        da = New SqlDataAdapter(cmd) 
        da.Fill(ds, "Customer") 
       Catch ex As Exception 

       End Try 
      End Using 
     End Using 
+1

Używanie instrukcji jest bezpieczniejsze, ale próba/catch ignorująca wszystkie wyjątki jest odradzana w większości sytuacji. Więc jak i gdzie umieścić próbę złapać wszystko zależy od tego, co próbujesz osiągnąć. Jakie jest Twoje pytanie? –

+0

to pytanie wydaje mi się być lepiej dostosowane do codereview.stackexchange.com –

+0

Puste try/catch był tylko przykład, ale w tym przypadku było to tylko dla bezpieczeństwa. Zewnętrzny w stosunku do procedury, w której miałem zamiar sprawdzić zestaw danych, zawierał tabele. Gdyby tak nie było, poradziłbym sobie z tym odpowiednio. Jeśli chodzi o to pytanie, to było na samym szczycie - pytałem, jaki jest najlepszy sposób radzenia sobie ze sprzedażą SqlCommand. Osobiście uważam, że przykład 5 jest prawidłowy, ale chciał poznać opinie innych. –

Odpowiedz

7

Komenda DataAdapter.Fill będzie otwierać i zamykać samego połączenia, więc nie trzeba się cmd.Connection.Open(). (Odsyłacz: sekcja uwag w http://msdn.microsoft.com/en-us/library/377a8x4t.aspx.)

Skorzystanie z Using dla SqlConnection wywołuje dla ciebie .Close.

Zmienna cmd kwalifikuje się do usuwania śmieci, gdy jest poza zakresem (lub wcześniej, jeśli system .NET określa, że ​​nie będzie ponownie używany).

W twoim przykładzie 2, nie jestem pewien, czy to dobry pomysł, aby pozbyć się cmd zanim DataAdapter go użyje.

+0

Dzięki. Nie wiedziałem o adapterach danych, więc odpowiednio się zmienię. Więc jeśli element staje się gotowy do zbierania śmieci, czy mówisz, że instrukcja Using nie jest naprawdę potrzebna? –

+0

@ cw_dev Tak. Jedną z rzeczy, które mnie ugryzły, jest "Używanie cmd ... cmd.Connection = ... cmd.Connection.Open() ... (wykonaj i przeczytaj) ... Zakończ używanie", które się nie zamyka połączenie w cmd. Jednak nie wygląda na to, że to zrobisz. Używanie 'Using' na SqlConnection jest wygodną metodą, aby dostać się do .Close() połączenia dla ciebie. –

Powiązane problemy