我试图根据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;
}
}
}