Tome el ejemplo siguiente ...SqlCommand (using/Eliminación tema)
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
De mi investigación actual se suena como si esto es básicamente bien, pero el SqlCommand no está siendo eliminado.
Pregunta -> ¿Cuál de los siguientes ejemplos es la mejor manera de lidiar con esto?
Ejemplo 2 - Eliminar manualmente
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
Ejemplo 3 - Automatic desechar con la declaración Usando
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
Ejemplo 4 - El mismo que en el ejemplo 3 pero el Try/Catch está dentro del Uso - ¿Esto hace la diferencia?
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
Ejemplo 5 - Lo mismo que en el ejemplo 4, pero CommandText y CN se especifican en la instrucción using - ¿Qué ventaja tiene esto?
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
Ejemplo 6 - Lo mismo que en el ejemplo 5 pero la conexión se abre en cn en lugar de cmd. ¿Es mejor abrir la conexión en cmd si solo se va a ejecutar un procedimiento almacenado?
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
La sentencia using es más segura, pero se desaconseja un try/catch que ignora todas las excepciones en la mayoría de las situaciones. Entonces, cómo y dónde pones tu intento de captura depende de lo que estás tratando de lograr. ¿Cuál es tu pregunta? –
me parece que esta pregunta es más adecuada para codereview.stackexchange.com –
El try/catch vacío era solo un ejemplo, pero en este caso solo estaba ahí por seguridad. Externo al procedimiento en el que estaba esto iba a verificar que el conjunto de datos contenía alguna tabla. Si no fuera así, me ocuparía de manera apropiada. En cuanto a la pregunta, estaba en la cima, me preguntaba cuál es la mejor manera de lidiar con la eliminación de SqlCommand. Personalmente creo que el Ejemplo 5 es el correcto, pero quería saber los comentarios de los demás. –