Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/304.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# SQLite正在为内存中的数据库创建磁盘文件_C#_Sqlite - Fatal编程技术网

C# SQLite正在为内存中的数据库创建磁盘文件

C# SQLite正在为内存中的数据库创建磁盘文件,c#,sqlite,C#,Sqlite,我试图根据SQLite站点上提供的文档创建一个可共享的内存数据库。但我最终找到了解决问题的办法 var connectionString = "Data Source=sharedmemdb;Mode=Memory;Cache=Shared"; using (var connection1 = new SQLiteConnection(connectionString)) { connection1.Open()

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

在得到这个错误后,我查看了应用程序目录,发现了文件“sharedmemdb”,这意味着SQLite没有创建可共享内存数据库

你知道为什么会这样吗

使用块将命令移动到
后:

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 ---------------+

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

您确定没有剩余的连接吗?是。没有剩余的连接我可以重现此问题。但我不知道为什么我找不到任何证据证明C#SQLite连接字符串支持mode参数(SQLite本身当然支持,但谁知道微软版本在做什么)。如果您只需要一个共享内存数据库,您可以改为连接到:memory:@Cubic。谢谢但我希望其他连接可以共享此文件。您是否测试了
FullUri=file:mem.db?mode=memory&cache=shared
System.Data.SQLite
命名空间?您能否给出一些
System.Data.SQLite