在.NET中从字节流加载SQLite数据库

11

我正在尝试加载一个SQLite数据库,该数据库将作为资源嵌入我的可执行文件中。对于那些好奇的人来说,这是因为我使用一个小型的SQLite数据库来存储配置数据,并且我希望在可执行文件内嵌入默认配置(我讨厌随程序携带文件)。

这只是默认配置。也就是说,在构建我的程序之后,我不需要修改此配置。它是静态的,不能更改。

我正在使用System.Data.SQLite包装器来使用SQLite。

我可以像这样访问字节流:

using (var stream =
          Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
    // use of "stream" here.
}

不过,我在创建一个SQLiteConnection对象时遇到了困难。

简单的方法是每次程序加载时生成一个新的配置文件,然后告诉SQLite从该文件中读取。这可能会起作用,但我想避免使用这种技术 - 我计划重用我的解决方案来包括国际化支持(其中每种语言都是[压缩的]SQLite数据库,而默认语言嵌入在可执行文件中 - 用户可以通过将其他语言数据库复制到程序的工作目录中添加其他语言)。

我不关心在内存中保存此数据库的内存成本。它将非常小(可能少于50 KiB),所以这并不令我烦恼。显然,如果这是一个更大的数据库,这可能是个问题。

最后,我意识到这可能被视为存储配置的一种差劲方式。虽然我同意基于纯文本的解决方案很好,适用于用户手动输入所有设置的情况,但这主要用于存储用户没有明确定义的设置。例如,在应用程序中存储各种停靠窗口的位置,或者存储有关内部资源可以在哪里找到的数据。

谢谢您的帮助。


1
7年过去了,想知道你是否找到了解决方案,可以将SQLite数据库从内存保存为二进制文件或从流中加载它? - lucuma
不,说实话,我甚至不知道当时我在尝试做什么(那时我只是大学二年级)。如果现在我必须要实现这个,我可能会像所选答案建议的那样,将必要的SQL文本存储在二进制文件中。 - Ethan
我有一个商业案例,所以你的大学问题在事情的计划中并不那么糟糕。主要是Azure文件IO非常慢,我们需要生成一个大型的SQL Lite数据库来发送下游。 - lucuma
2个回答

6

似乎在System.Data.SQLite提供程序中没有实现此功能。您甚至无法将内存数据库保存到文件中(即以二进制格式),只能以SQL转储的形式保存。

因此,其中一种解决方案是将数据库创建的SQL代码存储在资源中。然后每次应用程序启动时都会创建内存数据库。


我已经考虑过了,目前看来这似乎是唯一的方法。无论如何,它不应该太大:我本来打算尝试压缩资源的(因为带有大量文本的SQLite数据库似乎可以很好地压缩)。 - Ethan

-1

6
好的,如果我想要从一个空数据库开始,那就可以这样做。但是在这种情况下,我有一个已经存在的二进制流,我希望它被读入作为一个数据库,而不仅仅是打开一个新的数据库。 - Ethan
@Ethan:我在我发布的示例中没有看到任何关于这是一个空数据库的内容。但老实说,我以前从来没有真正使用过SQLite,只是想帮忙,所以可能不太清楚我在说什么 :) - mellamokb
也许有一种方法可以做到这一点,但是你的例子存在问题,因为没有地方让我传递二进制流。如果这是非托管代码,我可能可以做一些荒谬的事情,比如手动传递内存中流的地址/大小,但我相当确定在.NET中不可能实现这一点。 - Ethan

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