2011-12-31 16 views
6

Używam System.data.sqlite.dll w moim programie vb.net. I dla mojego życia nie mogę odczytać kodu aktywującego tryb WAL.System.data.sqlite - Aktywacja trybu dziennika WAL

Czy aktywuję to polecenie zaraz po utworzeniu bazy danych lub przy każdym nowym połączeniu SQLiteConnection.

A jeśli tak, jaki kod musiałby być stosowany w tej chwili jestem przy użyciu coś takiego:

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

jest to w jaki sposób należy stosować że komenda PRAGMA?

Odpowiedz

8

Zawsze można użyć klasy SQLiteConnectionStringBuilder aby wykonać zadanie dla Ciebie:

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

Należy zauważyć, że nie trzeba ustawiać WAL dla każdego połączenia - wystarczy ustawić go raz podczas tworzenia bazy danych. – UGEEN

1

Musisz wykonać komendę jako brakującą komendę.

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

Dopóki utrzymać otwarte połączenie, setting this once będzie wystarczające.

+0

Dzięki, bardzo docenione. Jednak często staram się zamknąć połączenie, zwykle po wstawieniu, Update Ect .. Czy to znaczy, że muszę to uwzględnić w moich Insert, Update, Delete, subs? –

+1

Niestety, tak. Jeśli jest to lokalna baza danych, nie powinno być żadnych problemów z pozostawieniem połączenia otwartego przez cały czas trwania aplikacji. Robimy to cały czas na urządzeniach mobilnych i tabletach z lokalną bazą danych. –

+0

Dobry przykład, dzięki. – kwoxer

3

Jest to ciąg połączenia próbka z mojego projektu (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> 

Zamiast journal mode=Memory możesz podać journal mode=WAL.

Jeśli nie określisz trybu dziennika w łańcuchu połączenia, możesz go zmienić ręcznie, wykonując zapytanie do bazy danych w kwicie PRAGMA jounal_mode=WAL.

Powiązane problemy