代码之家  ›  专栏  ›  技术社区  ›  Abhishek Ginani

SQLite正在为内存数据库创建磁盘文件

  •  2
  • Abhishek Ginani  · 技术社区  · 7 年前

    我试图根据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的数据库,并且在建立连接时启用了共享缓存,因此其他连接也可以访问这个连接。如果我第一次运行这个程序,效果很好,但是如果我关闭应用程序并再次运行,它就会抛出错误“table message already exists”,这看起来很奇怪,因为我在内存中创建了这个表,如果应用程序重新启动,它就不可用。

    在得到这个错误之后,我查看了应用程序目录并找到了文件“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;
                        }
                    }
                }
    
    1 回复  |  直到 7 年前
        1
  •  4
  •   Cubic mgsloan    7 年前

    system.data.sqlite不支持“模式”参数(即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 ---------------+
    

    (第一行是实际连接字符串,下两行将其分解)

    推荐文章