C# SQLite正在为内存中的数据库创建磁盘文件
我试图根据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()
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