我正在尝试加载一个SQLite数据库,该数据库将作为资源嵌入我的可执行文件中。对于那些好奇的人来说,这是因为我使用一个小的SQLite数据库来存储配置数据,我想发送嵌入在可执行文件中的默认配置(我讨厌必须随文件一起携带文件)。
这只是默认配置。也就是说,我不需要修改此配置。它是静态的,在构建程序后无法更改。
我正在使用SQLite的System.Data.SQLite包装器。
我可以像这样访问字节流:
using (var stream =
Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) {
// use of "stream" here.
}
但是,我对此流中创建SQLiteConnection
对象感到茫然。
简单的方法是在每次程序加载时简单地生成一个新的配置文件,然后告诉SQLite从该文件中读取。这可能会有效,但我想避免使用这种技术 - 我计划重复使用我的解决方案来解决这个问题,同时还包括国际化支持(其中每种语言都是[压缩的] SQLite数据库,默认语言嵌入在可执行文件中 - 用户可以添加其他语言,只需将其他语言数据库复制到程序的工作目录中。
我不关心在内存中保存此数据库的内存成本。它会非常小(可能小于50 KiB),所以这不会打扰我。显然,如果这是一个更大的数据库,这可能是一个问题。
最后,我知道这可能被视为存储配置的一种不好的方式。虽然我同意基于纯文本的解决方案适用于用户手动输入所有设置的情况,但这主要用于用户未明确定义的设置。例如,将各种停靠窗口的位置存储在应用程序中,或存储有关可能找到内部资源的位置的数据。
感谢您的帮助。
答案 0 :(得分:5)
似乎此功能未在System.Data.SQLite提供程序中实现。您甚至无法将内存数据库保存到文件(即以二进制格式),只能以SQL转储的形式。
因此,其中一个解决方案是存储用于在资源中创建数据库的SQL代码。然后在每次应用程序启动时在内存db中创建。
答案 1 :(得分:0)
我相信您想将此用作连接字符串:
Data source=:memory:
请参见此处:Opening a SQLiteConnection on a binary stream instead of a file?