¿Cómo se cierra completamente una cadena SQLConnection en vb.net?

Estoy ejecutando una aplicación multiproceso que se conecta a una base de datos, las conexiones se cierran cuando termino con ellas (y me deshago de todos los subprocesos). Intenté borrar los grupos de conexiones, estableciendo pooling = false y usé tanto .dispose como .close.

Aparece el error "no se puede eliminar la base de datos X porque está actualmente en uso" si intento eliminar la base de datos a la que me conecté después de que se hayan cerrado todas las conexiones. A continuación se muestra mi código:

Dim comExecuteInsert As New SqlCommand
Dim comm As New SqlConnection
If (Not comm Is Nothing) Then
    comm = Nothing
End If
comExecuteInsert.Connection = comm
comExecuteInsert.CommandType = CommandType.StoredProcedure
comExecuteInsert.CommandText = strProcedureName
comExecuteInsert.CommandTimeout = 26000
comExecuteInsert.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = strTableName
comExecuteInsert.Parameters.Add("@filename", SqlDbType.VarChar, 500).Value = strFileName
comExecuteInsert.ExecuteScalar()
comExecuteInsert.Parameters.Clear()

comExecuteInsert = Nothing
comm.Close()
SqlConnection.ClearPool(comm)

El procedimiento almacenado crea tablas temporales que luego descarta e inserta datos en tablas existentes en la base de datos.

preguntado el 16 de mayo de 11 a las 18:05

¿Es que está tratando de eliminar la base de datos o simplemente asegurarse de cerrar las conexiones (lo que en realidad devuelve la conexión al grupo de conexiones y solo más tarde la cierra)? -

@mellamokb Cierro la conexión con comm.Close () la penúltima línea de mi código. -

@Thomas Quiero cerrar la conexión y quiero eliminar la base de datos. -

¿Quiere soltar la base de datos en código? -

@Thomas Sí, lo hago, pero puedo hacerlo con éxito antes de abrir las conexiones. -

5 Respuestas

No está desechando su objeto de comando.

En lugar de

comExecuteInsert = Nothing

tratan

comExecuteInsert.Dispose

O prueba lo siguiente:

Using comm As New SqlConnection
  Using comExecuteInsert As New SqlCommand
    comExecuteInsert.Connection = comm
    comExecuteInsert.CommandType = CommandType.StoredProcedure
    comExecuteInsert.CommandText = strProcedureName
    comExecuteInsert.CommandTimeout = 26000
    comExecuteInsert.Parameters.Add("@tableName", SqlDbType.VarChar, 100).Value = strTableName
    comExecuteInsert.Parameters.Add("@filename", SqlDbType.VarChar, 500).Value = strFileName
    comExecuteInsert.ExecuteScalar()
    comExecuteInsert.Parameters.Clear()
    comm.Close()
  End Using
End Using

contestado el 17 de mayo de 11 a las 09:05

Si está intentando cerrar cualquier conexión a una base de datos para poder eliminarla, puede ejecutar algo como lo siguiente contra el master base de datos en Management Studio:

Alter Database MyDatabaseName Set Single_User With Rollback Immediate
GO
Drop Database MyDatabaseName
GO

Para hacer esto en el código, necesitaría abrir una conexión separada al master base de datos y ejecute cada una de las declaraciones anteriores individualmente (y no intente ejecutar la GO palabras). Tenga en cuenta que esto matará todas conexión a la base de datos, incluidas otras que no sean las suyas, sin importar lo que estén haciendo.

contestado el 16 de mayo de 11 a las 22:05

Me perdí la parte en la que dijiste que estabas lanzando una base de datos. Necesitas usar

SqlConnection.ClearAllPools()

SQL Server almacena en caché las conexiones para su reutilización. Lo anterior borra las conexiones en caché.

Por ejemplo...

Sub Demo_DropDatabase(ByVal strCnn As String, ByVal strDBName As String)
  Using cnnSQLS As New SqlConnection(strCnn)
    SqlConnection.ClearAllPools()
    cnnSQLS.Open()
    Dim strSQL As String = "DROP DATABASE [" & strDBName & "]"
    Using cmdDrop As New SqlCommand(strSQL, cnnSQLS)
      cmdDrop.ExecuteNonQuery() 'N.B. may throw exception '
    End Using
    cnnSQLS.Close()
  End Using
End Sub

contestado el 24 de mayo de 15 a las 14:05

use la palabra clave using, consulte ¿Termina el uso de cerrar una conexión SQL abierta?

contestado el 23 de mayo de 17 a las 14:05

Lo intenté y no funciona, tal vez haya algo en mi procedimiento almacenado que mantiene abierta mi base de datos. - RobinReborn

Utilice el siguiente T-SQL en su código VB.Net para eliminar las conexiones existentes.

TSQL

declare @vSqlTx AS varchar(max);

select @vSqlTx = concat(@vSqlTx, ' KILL ', spid, ';', CHAR(13))
from sys.sysprocesses
where DB_NAME(NULLIF(dbid, 0))  = <'yourDatabaseName'>
and spid != @@spid;

print @vSqlTx;
exec (@vSqlTx);

Código VB.NET:

Private Sub CloseAllOtherConnections(ByVal conStr As String, ByVal databaseName As String)
    Dim strSqlText As String 

    Using con As New SqlConnection(conStr)      
        SqlConnection.ClearAllPools()
        con.Open()


        strSqlText = "  declare @vSqlTx AS varchar(max);

                    select @vSqlTx = concat(@vSqlTx, ' KILL ', spid, ';', CHAR(13))
                    from sys.sysprocesses
                    where DB_NAME(NULLIF(dbid, 0))  = '" & databaseName & "'
                    and spid != @@spid;

                    print @vSqlTx;
                    exec (@vSqlTx); "

        Dim cmd As New SqlCommand(strSqlText, con)
        cmd.ExecuteNonQuery()       
        con.Close()     
  End Using

End Sub

Respondido 09 Oct 19, 12:10

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.