簡體   English   中英

SQLite正在為內存數據庫創建磁盤文件

[英]SQLite is creating a disk file for In-memory DB

我試圖根據SQLite網站上提供的文檔創建一個可共享的內存數據庫。 但是我最終找到了解決問題的方法。

 var connectionString = "Data Source=sharedmemdb;Mode=Memory;Cache=Shared";

            using (var connection1 = new SQLiteConnection(connectionString))
            {
                connection1.Open();

                var command1 = connection1.CreateCommand();
                command1.CommandText =
                    "CREATE TABLE Message ( Text TEXT );" +
                    "INSERT INTO Message ( Text ) VALUES ( 'Is there anybody out there?' );";
                command1.ExecuteNonQuery();

                using (var connection2 = new SQLiteConnection(connectionString))
                {
                    connection2.Open();

                    var command2 = connection2.CreateCommand();
                    command2.CommandText = "SELECT Text FROM Message;";


                    var message = command2.ExecuteScalar() as string;
                }
            }

如果執行此代碼,它將創建一個名為sharedmemdb的內存數據庫,並在建立連接時啟用了共享緩存,因此該連接也可供其他連接訪問。 如果我第一次運行,這很好,但是如果我關閉應用程序,然后再次運行,它會拋出錯誤“表消息已存在”,這在我創建內存表時看起來很奇怪,如果應用程序重新啟動,則該表不可用。

收到此錯誤后,我查看了應用程序目錄,並找到文件“ sharedmemdb”,這意味着SQLite沒有創建可共享的內存數據庫。

任何線索為什么會這樣?

將命令移至using塊后:

var connectionString = "Data Source =sharedmemdb; Mode = Memory; Cache = Shared";

            using (var connection1 = new SQLiteConnection(connectionString))
            {
                connection1.Open();

                using (var command1 = connection1.CreateCommand())
                {
                    command1.CommandText =
                        "CREATE TABLE Message ( Text TEXT );" +
                        "INSERT INTO Message ( Text ) VALUES ( 'Is there anybody out there?' );";
                    command1.ExecuteNonQuery();
                }
                using (var connection2 = new SQLiteConnection(connectionString))
                {
                    connection2.Open();

                    using (var command2 = connection2.CreateCommand())
                    {
                        command2.CommandText = "SELECT Text FROM Message;";


                        var message = command2.ExecuteScalar() as string;
                    }
                }
            }

System.Data.SQLite不支持“ Mode”參數(即Microsoft.Data.Sqlite)。

但是,在System.Data.SQLite中,您可以使用“ FullUri”參數直接將參數傳遞給SQLite,因此您可以通過將連接字符串更改為

FullUri=file:mem.db?mode=memory&cache=shared
Protocol^    ^      ^           ^
DB Name -----|      |           |
Use memory mode ----+           |
Use shared cache ---------------+

(第一行是實際的連接字符串,接下來的兩行將其分解)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM