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

Estoy ejecutando una aplicación multiprocess que se conecta a una database, las conexiones se cierran cuando termino con ellas (y elimino todos los hilos). Intenté borrar los pools de connection, estableciendo pooling = false y he usado tanto .dispose como .close.

Me sale el error "no puedo soltar la database X porque está actualmente en uso" si trato de soltar la database a la que me he conectado después de que se hayan cerrado todas las conexiones. A continuación está 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.StonetworkingProcedure 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 database.

No está eliminando su object de command.

En lugar de

 comExecuteInsert = Nothing 

tratar

 comExecuteInsert.Dispose 

O intente lo siguiente:

 Using comm As New SqlConnection Using comExecuteInsert As New SqlCommand comExecuteInsert.Connection = comm comExecuteInsert.CommandType = CommandType.StonetworkingProcedure 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 

Si está intentando cerrar cualquier connection a un file db para poder soltarlo, puede ejecutar algo como lo siguiente en la database master en Management Studio:

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

Para hacer esto en código, necesitaría abrir una connection separada a la database master y ejecutar cada una de las declaraciones anteriores individualmente (y no intentar ejecutar las palabras GO ). Tenga en count que esto matará todas las conexiones a la database, incluidas las que no sean las suyas, sin importar lo que estén haciendo.

Me perdí la parte en la que dijiste que estabas abandonando una database. Tienes que usar

 SqlConnection.ClearAllPools() 

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

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() 'NB may throw exception ' End Using cnnSQLS.Close() End Using End Sub 

utilice la palabra key using, consulte ¿End End cierra una connection SQL abierta?