【问题标题】:Loading an SQLite database from a byte stream in .NET从 .NET 中的字节流加载 SQLite 数据库
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

  • 我已经考虑过了,在这一点上,这似乎是唯一的出路。无论哪种方式,它都不应该太大:无论如何我都会尝试压缩资源(因为带有大量文本的 SQLite 数据库似乎可以很好地压缩)。
【解决方案2】:

我相信您想将它用于您的连接字符串:

Data source=:memory:

请参见此处,例如:Opening a SQLiteConnection on a binary stream instead of a file?

【讨论】:

  • 是的,如果我想从一个空数据库开始,那就太好了。但在这种情况下,我有一个现有的二进制流,我希望它作为数据库读取,而不是简单地打开一个新流。
  • @Ethan:在我发布的示例中,我没有看到任何关于这是一个空数据库的内容。但老实说,我以前从未真正使用过 SQLite,只是想提供帮助,所以我可能不知道我在说什么 :)
  • 好吧,也许有办法做到这一点,但你的例子的问题是我没有地方可以传递二进制流。如果这是非托管代码,我可能会做一些荒谬的事情,比如在内存中手动传递流的地址/大小,但我相当肯定这在 .NET 中是不可能的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-06-21
  • 1970-01-01
  • 1970-01-01
  • 2013-09-09
  • 2012-01-19
  • 2017-10-09
  • 1970-01-01
相关资源
最近更新 更多