如何将SQLite数据库嵌入.NET DLL,然后从C#中使用它?

How can I embed a SQLite Database in a .NET DLL and then use it from C#?

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

最近,我在研究偶然发现SQLite的同时,为我的应用程序寻找了一种数据存储机制的解决方案。 我目前将SQLite与System.Data.SQLite包装器一起使用。

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

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

那我该如何访问数据库?

如果可以使用类似的方法,那就太好了:

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

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

3狐狸


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


这样是不可能的。您可以做的是将db嵌入dll项目中,并将其转储到文件系统上的特定位置(可能是AppData?),然后从那里进行读写。将db直接放在可执行文件(或dll)中可能不是一个好主意,因为它在技术上不可行,而且会膨胀应用程序的大小。

我喜欢发布一个可执行文件来分发它。就您而言,问题更多。这不仅仅是将数据库文件单独嵌入,与之关联的dll呢?步骤为2:

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

2)现在将您的db文件添加到项目的Resources中(并将其解压缩)

1
2
3
4
5
6
7
8
static void DumpDatabase()
{
    var dbFullPath = Utility.GetDbFullPath(); //your path
    if (File.Exists(dbFullPath))
        return; //whatever your logic is

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

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
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;


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

要从DLL加载数据:

  • 使用System.Reflection.Assembly从DLL文件加载字符串。 (字符串是DB的转储)
  • 在内存中创建空的SQLite DB。
  • 使用加载的字符串作为对DB的查询以恢复其内容。
  • 现在,您可以在内存中进行任何查询。

    要将数据保存到DLL:

  • 将数据库内容转储到字符串中。
  • 创建包含用C#代码包装的SQL转储的临时文件。
  • 使用" csc"(或Mono中的" gmcs")进行编译。
  • 这很愚蠢,但应该可以。希望您永远不会那样编码。


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


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

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

    请访问www.sqlite.org/amalgamation.html了解更多信息。