Visual CSharp .NET - cerrar del todo SqlConnection

 
Vista:
sin imagen de perfil

cerrar del todo SqlConnection

Publicado por Beni Jimenez (1 intervención) el 18/04/2011 11:49:11
Buenas!! Mientras escribía este hilo iba documentando y probando opciones, hasta el punto que he conseguido dar con una solución. Elegante? quizás no, pero hasta el momento la única respuesta a mis problemas.

Asi pues, este hilo, para no borrarlo, lo dejo como documentación por si algun otro tiene problemas similares. Y, de paso, por si alguien tiene otra forma más elegante de cerrar las dichosas conexiones del sqlconnection.


Tengo una aplicación automática que debería recuperar varias copia de seguridad (secuencialmente) sobre diferentes bases de datos "temporales", tratar los datos, y finalmente eliminar las bases de datos.

El problema es que al abrir una conexión con SqlConnection ya no hay manera de borrar la base de datos. El siguiente error aparece:

"No se pudo obtener accdeso exclusivo porque la base de datos está en uso"

Sobre posibles soluciones he estado indagando, encontrando varias soluciones, algunas que ya tenía, y otras que no me han servido:

1) Cerrar la conexión con el método Dispose()
- Esto ya lo estaba haciendo. Incluso añadí antes del Dispose el método Close por si pudiera aportar algo más... pero nada

2) utilizar 'using' (sacado de la página de microsoft): Para garantizar que las conexiones se cierren siempre, abra la conexión dentro de un bloque using
- persiste el problema

3) Poner la base de datos en modo SINGLE_USER
ALTER DATABASE miBD SET SINGLE_USER WITH ROLLBACK IMMEDIATE
- La pongo en este modo antes de intentar borrar la base de datos, pero no me cierra las conexiones que hubiera abiertas desde programa.

4) Existe la opción de "Pooling" (por defecto activo), que guarda las conexiones para ser reutilizadas.
- BIÉN, AQUI ESTAN LAS CONEXIONES QUE ME DABAN PROBLEMAS. Como posible solución (que no he probado), creo haber leído que puede añadirse a la cadena de conexión la opción "Pooling=False", la cual no guardaría la conexión al ser liberada.
En si creo que con esto desaprovecharía la ventaja que aporta en velocidad pues necesito realizar varias conexiones sobre la base de datos para tratarla.
- Así pues, por el momento me he quedado con la segunda opción, que es el uso del método:
SqlConnection.ClearAllPools(), el cual puede que sea excesivo puesto que pierdo también otras conexiones, pero en principio es la primera solución que me permite liberar por completo una base de datos para borrarla.

Saludos
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder