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(
2)现在将您的db文件添加到项目的
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); } |
并在连接字符串中添加
我认为将数据存储在DLL中不是一个好主意,但是有一种肮脏的方法可以做到这一点。
要从DLL加载数据:
现在,您可以在内存中进行任何查询。
要将数据保存到DLL:
这很愚蠢,但应该可以。希望您永远不会那样编码。
如果您使用的是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了解更多信息。