【发布时间】:2011-09-19 02:40:48
【问题描述】:
我正在尝试加载一个 SQLite 数据库,该数据库将作为资源嵌入到我的可执行文件中。对于那些好奇的人,这是因为我使用了一个小型 SQLite 数据库来存储配置数据,并且我想发布嵌入在可执行文件中的默认配置(我讨厌必须将文件与程序一起携带)。
这只是默认配置。也就是说,我不需要修改这个配置。它是静态的,在我的程序构建后无法更改。
我正在使用 SQLite 的 System.Data.SQLite 包装器。
我可以像这样访问字节流:
using (var stream =
Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
// use of "stream" here.
}
但是,我不知道从该流中创建 SQLiteConnection 对象。
简单的方法是在每次程序加载时生成一个新的配置文件,然后告诉 SQLite 从该文件中读取。这可能会起作用,但我想避免这种技术 - 我计划重用我的解决方案来解决这个问题,以包括国际化支持(其中每种语言都是 [压缩] SQLite 数据库,默认语言嵌入在可执行文件中 - 一个用户只需将其他语言数据库复制到程序的工作目录即可添加其他语言。
我不关心将此数据库保存在内存中的内存成本。它会非常小(可能小于 50 KiB),所以这不会打扰我。显然,如果这是一个更大的数据库,这可能是个问题。
最后,我知道这可能被视为存储配置的一种糟糕方式。虽然我同意基于纯文本的解决方案适用于用户手动输入所有设置的情况,但这主要用于用户未明确定义的设置。例如,存储应用程序中各种停靠窗口的位置,或存储有关内部资源可能在何处找到的数据。
感谢您的帮助。
【问题讨论】:
-
7 年后,想知道您是否有解决此问题的方法,允许您将 sql lite 数据库从内存中保存到二进制文件或从流中加载?
-
不。老实说,我什至不知道我想在这里做什么(当时我刚上大学二年级)。如果我现在必须实现它,我可能只是将必要的 SQL 文本存储在二进制文件中,正如所选答案所暗示的那样。
-
我有一个商业案例,所以你的大学问题在计划中并没有那么糟糕。主要是 Azure 文件 IO 非常慢,我们需要生成一个大型 sql lite db 发送到下游。
标签: .net sqlite system.data.sqlite