在C#中,有没有办法将内存中的文件作为内存中的SQLite数据库与System.Data.SQLite链接?

时间:2011-05-31 17:22:36

标签: c# sqlite connection system.data.sqlite in-memory-database

我想要做的是以下几点:

using System.Data.SQLite;
using System.IO;

//My SQLite connection
SQLiteConnection myCon;

public void ReadAndOpenDB(string filename)
{
    FileStream fstrm = new FileStream(filename, FileMode.Open);
    byte[] buf = new byte[fstrm.Length];
    fstrm.Read(buf, 0, (int)fstrm.Length);
    MemoryStream mstrm = new MemoryStream(buf);

    //Do some things with the memory stream

    myCon = new SQLiteConnection(/*attach to my memory stream for reading*/);
    myCon.Open();

    //Do necessary DB operations
}

我不打算写入内存数据库,但我需要能够在连接到程序之前在程序的内存中对文件执行一些操作。

2 个答案:

答案 0 :(得分:3)

如果您不介意使用Interop并直接转到CreateFile()(然后将返回的HANDLE包装在FileStream中),您可以查看创建指定了FILE_ATTRIBUTE_TEMPORARY的文件,该文件不会将文件写入磁盘只要有可用的缓存,并且当句柄关闭时会自动删除该文件。

  

如果有足够的高速缓存可用,则指定FILE_ATTRIBUTE_TEMPORARY属性会导致文件系统避免将数据写回大容量存储,因为应用程序在句柄关闭后删除临时文件。在这种情况下,系统可以完全避免写入数据。虽然它不像前面提到的标志那样直接控制数据缓存,但FILE_ATTRIBUTE_TEMPORARY属性确实告诉系统尽可能多地保留在系统缓存中而不写入,因此可能会引起某些应用程序的关注。

答案 1 :(得分:0)

使用Interop和CreateFile()太复杂了。这是一个使用FILE_ATTRIBUTE_TEMPORARY属性创建文件的简单方法,该属性将尽可能使用高速缓存:

var file = File.Create(path);
File.SetAttributes(path, File.GetAttributes(path) | FileAttributes.Temporary);