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
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? –
to pytanie wydaje mi się być lepiej dostosowane do codereview.stackexchange.com –
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. –