11

我目前正在为我正在计划的一个项目进行一些评估工作。

我最近查看了针对我的应用程序的数据存储机制的解决方案,并且在研究时偶然发现了 SQLite。我目前将 SQLite 与 System.Data.SQLite 包装器一起使用。

我真的很喜欢它的工作方式,但我遇到了一个无法解决的问题,而且我在互联网上也找不到任何关于我的问题的帮助。

我希望将我的 SQLite 数据库嵌入到我的一个应用程序 DLL(即 Title.Storage.dll)中,以便在此 DLL 中使用。这可能吗?

那我怎样才能访问数据库呢?

如果我可以使用类似的东西会很棒:

SQLiteConnection con = new SQLiteConnection();
con.ConnectionString="DataSource=Title.Storage.storage.db3";
con.Open();

在此先感谢并致以最诚挚的问候,

3福克斯

4

5 回答 5

15

程序集不是用于文件存储,而是用于代码存储。虽然您可以将文件存储在程序集中,但它们是只读的。

于 2009-04-26T17:17:24.497 回答
3

这是不可能的。您可以做的是将数据库嵌入到您的 dll 项目中并将其转储到文件系统上的某个位置(可能是 AppData?)并从那里读取和写入。将 db 直接放在可执行文件(或 dll)中可能不是一个好主意,因为它除了在技术上不可行之外,还会增加应用程序的大小。

拥有一个可分发的可执行文件是我喜欢的口味问题。在你的情况下,但问题更多。这不仅仅是单独嵌入 db 文件,与之关联的 dll 呢?步骤是2:

1)将与您的数据库关联的必要dll(System.Data.SQLite?)添加到您的项目中Embedded Resource (不一定是 a Resource file,并让系统自动解决程序集冲突。在这里抓住它怎么做。

2)现在将您的 db 文件添加到您Resources的项目中(并提取它)

static void DumpDatabase()
{
    var dbFullPath = Utility.GetDbFullPath(); //your path
    if (File.Exists(dbFullPath))
        return; //whatever your logic is

    File.WriteAllBytes(dbFullPath, Properties.Resources.myDb);
}

甚至最好不要将数据库嵌入到您的项目中,而是编写逻辑以在您的应用程序中创建数据库。如果明天您需要更改 SQLite 的版本,比如从 3 到 4,该怎么办?使用第一种方法,您需要为自己创建一个数据库并将其重新嵌入到项目中。但是,如果您正在编写在应用程序中创建数据库的逻辑,那么更新 SQLite 版本只需更改 ADO.NET dll(代码保持不变)。可能是这样的:

static void DumpDatabase()
{
    var dbFullPath = Utility.GetDbFullPath();
    if (File.Exists(dbFullPath))
        return; //whatever your logic is

    CreateDb(dbFullPath);
}

static void Create(string dbFullPath)
{
    SQLiteConnection.CreateFile(dbFullPath);

    string query = @"

    CREATE TABLE [haha] (.............)
    CREATE TABLE ..............";

    Execute(query);
}

并在连接字符串中添加FailIfMissing=False;

于 2012-11-11T07:35:43.303 回答
0

如果您使用的是 NTFS,则可以使用备用数据流。在我的项目中,我们使用名为 :DB 的备用流将 SQLite 数据库隐藏在另一个文件中。

于 2009-05-23T17:38:38.120 回答
0

我不认为将数据存储在 DLL 中是一个好主意,但是有一种肮脏的方法可以做到这一点。

从 DLL 加载数据:

  1. 使用 System.Reflection.Assembly 从 DLL 文件加载字符串。(字符串是 DB 的转储)
  2. 在内存中创建空的 SQLite DB。
  3. 使用加载的字符串作为对 DB 的查询来恢复其内容。

现在您可以在内存中进行任何查询。

要将数据保存到 DLL:

  1. 将 DB 内容转储为字符串。
  2. 创建包含用 C# 代码包装的 SQL 转储的临时文件。
  3. 使用“csc”(或 Mono 中的“gmcs”)编译它。

这很愚蠢,但它应该工作。希望你永远不会那样编码。

于 2009-05-31T17:37:04.440 回答
-2

SQLite 被打包和分发为带有几个(我认为是 3 个)头文件的单个 C 文件。这意味着您可以用一个编译命令编译整个 50000 行程序并得到一个 .o 文件。从那里,您可以将它与您链接到该 DLL 的其他文件链接到您的应用程序 DLL。

一旦你将 sqlite3.o 构建到你的应用程序 DLL 中,它的 SQLite API 中的符号就会对你的程序可用,就像你的其他 C/C++ DLL 对你的 C#/VB 程序可用一样。

查看 www.sqlite.org/amalgamation.html 了解更多信息。

于 2009-05-24T02:20:50.230 回答