我尝试根据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;
}
}
}
答案 0 :(得分:4)
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 ---------------+
(第一行是实际的连接字符串,下一行将其分解)