2011-12-31 14 views
6

Estoy usando System.data.sqlite.dll en mi programa vb.net. Y por mi vida no puedo encontrar el código para activar el modo WAL.System.data.sqlite - Activando el modo WAL Journal

Activo este comando justo después de Crear la base de datos o con cada nueva SQLiteConnection.

Y si es así qué código se necesitaría para ser utilizado en este momento im usando algo como:

cnn As New SQLiteConnection(String.Format("Data Source={0}\{1};PRAGMA jounal_mode=WAL;", Application.StartupPath, DBName)) 

¿Es así como se debe utilizar ese comando PRAGMA?

Respuesta

8

Siempre se puede utilizar la clase SQLiteConnectionStringBuilder para hacer el trabajo para usted:

SQLiteConnectionStringBuilder connBuilder = new SQLiteConnectionStringBuilder(); 
    connBuilder.DataSource = filePath; 
    connBuilder.Version = 3; 
    //Set page size to NTFS cluster size = 4096 bytes 
    connBuilder.PageSize = 4096; 
    connBuilder.CacheSize = 10000; 
    connBuilder.JournalMode = SQLiteJournalModeEnum.Wal; 
    connBuilder.Pooling = true; 
    connBuilder.LegacyFormat = false; 
    connBuilder.DefaultTimeout = 500; 
    connBuilder.Password = "yourpass"; 


    using(SQLiteConnection conn = new SQLiteConnection(connBuilder.ToString())) 
    { 
    //Database stuff 
    } 
+0

Observe que no tiene que establecer WAL para cada conexión; basta con configurarlo una vez durante la creación de la base de datos. – UGEEN

1

Necesita ejecutar el pragma como un comando nonquery.

Using cmd As SQLiteCommand = cnn.CreateCommand() 
    cmd.CommandText = "PRAGMA journal_mode=WAL" 
    cmd.ExecuteNonQuery() 
End Using 

Como siempre que se mantenga la conexión abierta, setting this once será suficiente.

+0

Gracias, muy apreciado. Sin embargo, tiendo a cerrar la conexión a menudo, generalmente después de insertos, Ect de la actualización. ¿Eso significa que tengo que incluirlo con mis Insertar, Actualizar, Eliminar, subscribir? –

+1

Lamentablemente, sí. Si se trata de una base de datos solo local, no debería haber ningún inconveniente en dejar la conexión abierta durante toda la vida de la aplicación. Hacemos esto todo el tiempo con dispositivos móviles y tabletas que tienen una base de datos local. –

+0

Buen ejemplo, gracias. – kwoxer

3

Esta es una cadena de conexión muestra de mi proyecto (App.config):

<connectionStrings> 
    <add name="SQLiteDb" providerName="System.Data.SQLite" connectionString="Data Source=data.sqlite;Version=3;Pooling=True;Synchronous=Off;journal mode=Memory"/> 
    </connectionStrings> 

En lugar de journal mode=Memory puede especificar journal mode=WAL.

Si no especifica el modo diario en la cadena de conexión, puede cambiarlo manualmente ejecutando la consulta PRAGMA jounal_mode=WAL en la base de datos.

Cuestiones relacionadas