繁体   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