2013-10-01 127 views
2

我在SQLite上使用NHibernate的c#。 System.Data.SQLite版本1.0.88 SQLite的版本3.7.17不能使用SQLite的WAL模式

我最近發現了SQLite的WAL mode它看起來像正是我需要的。 問題是,我似乎無法得到它的工作。

文檔簡單地指出:

換算至WAL模式,使用下面的編譯指示:

PRAGMA journal_mode = WAL;

journal_mode pragma返回一個字符串,它是新日誌模式的 。成功後,該編譯指示將返回字符串 「wal」。如果無法完成到WAL的轉換(例如,如果VFS不支持必需的共享存儲器基元,則爲 ) 則日誌記錄模式將保持不變並且從原語返回 的字符串將爲先前的日誌記錄模式(例如 「刪除」)。

我一直都在代碼中嘗試這樣做:

ISQLQuery query = session.CreateSQLQuery("PRAGMA journal_mode=WAL;"); 
object result = query.UniqueResult(); 

SQLiteman管理應用程序中。

在每種情況下,我都會得到'delete'的返回值。即數據庫未能進入WAL模式。 問題是,我不知道爲什麼。我可以在文檔中看到的唯一可能性是您的文件系統不支持共享內存優先級,但我在Win 7上,所以這不是問題。

任何想法如何啓用WAL模式或找出爲什麼它不起作用?

回答

2

找到了答案。 看來,第一次創建連接時需要設置日記模式。 (我還沒有發現任何文件,指出了明確的,但它是唯一的辦法,我可以得到它的工作)

創建連接字符串時,我現在指定日記模式:

SQLiteConnectionStringBuilder connectionStringBuilder = new SQLiteConnectionStringBuilder(); 
connectionStringBuilder.DataSource = dbFile; 
connectionStringBuilder.JournalMode = SQLiteJournalModeEnum.Wal; 

我流利NHbiernate然後使用此配置:

SQLiteConfiguration.Standard.ConnectionString(connectionStringBuilder.ToString()) 
+0

是的,這是要走的路。 –

1

SQLite的犯規實際上改變日誌模式,直到寫(?或讀)已發行到數據庫。我不熟悉C#接口,但我已經看到它與Objective C接口。