内存流作为数据库

23
我正在考虑在我的C#项目中使用SQLite作为数据库引擎,但我遇到了以下问题:我找不到任何用于内存存储的API。我想实现的目标如下:
在程序启动时,我希望将数据库文件(从硬盘)加载到内存中。 在程序执行期间,我希望将这个内存流用作真正的数据库(读取、写入、插入、选择等)。 在关闭程序时,将流保存到文件中。
请问有人能够指点我正确的方向或者建议另一种更适合此目的的数据库引擎吗?
1个回答

47

您可以使用SQLite在线备份API,该API具有将db文件复制到内存、内存到文件的功能。 自1.0.80.0版本(带SQLite 3.7.11)起,在System.Data.SQLite中原生支持SQLite在线备份API

以下是在C#中使用API的简单示例:

SQLiteConnection source = new SQLiteConnection("Data Source=c:\\test.db");
source.Open();

using (SQLiteConnection destination = new SQLiteConnection(
  "Data Source=:memory:"))
{
  destination.Open();               

  // copy db file to memory
  source.BackupDatabase(destination, "main", "main",-1, null, 0);
  source.Close();

  // insert, select ,...        
  using (SQLiteCommand command = new SQLiteCommand())
  {
    command.CommandText =
      "INSERT INTO t1 (x) VALUES('some new value');";

    command.Connection = destination;
    command.ExecuteNonQuery();
  }             

  source = new SQLiteConnection("Data Source=c:\\test.db");
  source.Open();

  // save memory db to file
  destination.BackupDatabase(source, "main", "main",-1, null, 0);
  source.Close();               
}

1
谢谢你提供这个简洁清晰的解决方案。 - Anonymous
16
有没有一种方法可以在不触碰磁盘的情况下获取byte[]? - Gleno
3
警告:对于内存数据库使用备份 API 会取消 持久性 保证。 - user2864740
1
@Gleno:你需要将byte[]保存到临时文件(temp.db)中,然后使用备份API将其复制到内存数据库中。接着进行更改操作,再次使用备份API将更改后的数据存储到temp.db中。最后,将temp.db读取回byte[]中。 - Quintonn
1
Gleno,你是否找到了关于将SQLite数据库保存到内存流的解决方案? - Nick Chan Abdullah
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接