2012-05-05 16 views
7

Estoy creando aplicaciones de escritorio en winform que usarán la base de datos Sqlite.Cómo cerrar la conexión de Sqlite sin llamar explícitamente a Close Method usando .NET

Así que creé la clase Sqlite Helper que usa System.Data.SQLite y cada método de esa clase de Ayudante abre y cierra la conexión.

Pero ahora también he agregado la capacidad de adjuntar bases de datos adicionales, pero después de que Connection está cerrado, se pierden todas las bases de datos adjuntas.

Para corregir esto, modifiqué la clase para que la conexión se abra en el constructor y permanezca abierta.

Después de que la aplicación finalice, quiero que la conexión se cierre sin llamar explícitamente al método Cerrar.

¿Alguna sugerencia de cómo hacer eso?

+4

¿Se puede usar 'using' comunicado –

+0

@NikhilAgrawal - Eso sería un' u' minúsculas. – Oded

+0

No estoy seguro de cómo se crea la clase auxiliar en el evento Form_load y la aplicación usa esa clase durante el tiempo de vida de la aplicación. – user850010

Respuesta

5

Mantener la conexión abierta durante toda la vida de su aplicación no es una buena forma de hacerlo.
Sugiero no seguir esta ruta.
Por el contrario, intentaré encapsular la funcionalidad para adjuntar una base de datos dentro de un método que podría invocarse según la necesidad de usar la base.

Por ejemplo:

private static void AttachDB(string fileDB, string aliasName, SQLiteConnection cn) 
{ 
    string sqlText = string.Format("ATTACH '{0}' AS {1}", fileDB, aliasName) 
    SQLiteCommand cmd = new SQLiteCommand(sqlText, cn) 
    cmd.ExecuteNonQuery(); 
} 

a continuación en el código

using(SQLiteConnection cn = new SQLiteConnection(GetConnectionString())) 
{ 
    AttachDB(@"C:\SQLite\UserData.sqlite3", "UserData", cn); 
    // Do your code here 
} 
+0

¿Quiere abrir las conexiones lo más breve posible y después de abrir la conexión adjuntar las bases de datos? – user850010

+3

Sí, mantenga la conexión abierta durante el menor tiempo posible. Esa es una regla general. Uso de NET [agrupación de conexiones] (http://en.wikipedia.org/wiki/Connection_pool) para evitar el costo de reiniciar la conexión cada vez. Sin embargo, SQlite no lo habilita por defecto. Utilice una conexión de cadena como esta 'Fuente de datos = nombre de archivo; Versión = 3; Pooling = True; Max Pool Size = 100;'. [Ver aquí] (http://www.connectionstrings.com/sqlite) – Steve

+0

Pensé en eso también, pero me pareció más costoso volver a adjuntar bases de datos cada vez que uso métodos sqlite. – user850010

1

Dependiendo de cómo esté definida su clase, puede usar Dispose o un destructor. O bien, explícitamente llame a Close() al final del programa (desde dentro de Main, después de Run ...).

+0

Dispose y Destructor suena como lo que necesito. ¿Cuál debo usar? – user850010

+0

Como dije, depende de lo que hay en su clase. Lea [esto] (http: // msdn.microsoft.com/en-us/library/66x5fx1b(v=vs.80).aspx), [this] (http://msdn.microsoft.com/en-us/library/system.object.finalize (v = vs.80) .aspx) y [este] (http://msdn.microsoft.com/en-us/library/fs2xkftw (v = vs.80) .aspx) para ayudarlo a decidir. –

1

En C# hay una sintaxis especial para tal situación:

using(var connection = new Connection()) 
{ 
    //work with connection 
} 

compila a algo como:

Connection connection = null; 
try 
{ 
    connection = new Connection(); 
    //your operations 
} 
finally 
{ 
    connection.Dispose(); 
} 

en llamar a Dispose (usted) estrecha relación.

+1

No del todo: después de crear una instancia de la conexión, * aún * no está abierto, todavía tiene que invocar 'Abrir()'. Sin embargo, al hacerlo, se siente de alguna manera erróneo, asimétrico, al no llamar 'Close()' antes de 'Dispose()' ... –

4

Close no se debe desconectar la base de datos pero esto sólo funcionará cuando el mecanismo de conexión de puesta en común .NET está encendido. Asegúrate de que tienes que habilitar la cadena de conexión:

Data Source=filename;Version=3;Pooling=True;Max Pool Size=100; 
Cuestiones relacionadas