簡體   English   中英

如何在.NET DLL中嵌入SQLite數據庫,然后在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(即Title.Storage.dll)中,以便在此DLL中使用。 這可能嗎?

那我怎么才能訪問數據庫呢?

如果我可以使用類似的東西會很棒:

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

在此先感謝和最誠摯的問候,

3Fox

程序集不用於文件存儲,而是用於代碼存儲。 雖然您可以將文件存儲在程序集中,但它們是只讀的。

這是不可能的。 你可以做的是將db嵌入你的dll項目並將其轉儲到文件系統上的某個位置(可能是AppData?)並從那里讀寫。 將db直接放在可執行文件(或dll)中可能不是一個好主意,因為除了技術上不可行之外,它還會增加應用程序的大小。

分發一個可執行文件是我喜歡的品味問題。 在你的情況下,但問題更多。 它不只是單獨嵌入db文件,與它相關的dll怎么樣? 步驟是2:

1)將與數據庫關聯的必要dll( System.Data.SQLite ?)作為Embedded Resource (不一定是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;

如果您使用的是NTFS,則可以使用備用數據流。 在我的項目中,我們使用名為DB的備用流將SQLite數據庫隱藏在另一個文件中。

我不認為在DLL中存儲數據是一個好主意,但有一種骯臟的方法。

從DLL加載數據:

  1. 使用System.Reflection.Assembly從DLL文件加載字符串。 (字符串是DB的轉儲)
  2. 在內存中創建空的SQLite DB。
  3. 使用加載的字符串作為對DB的查詢以恢復其內容。

現在你可以在內存中進行任何查詢。

要將數據保存到DLL:

  1. 將DB內容轉儲為字符串。
  2. 創建包含用C#代碼包裝的SQL轉儲的臨時文件。
  3. 使用“csc”(或Mono中的“gmcs”)編譯它。

這是愚蠢的,但應該有效。 希望你永遠不會這樣編碼。

SQLite打包並作為單個C文件分發,其中包含一些(我認為3個)頭文件。 這意味着您可以使用一個編譯命令編譯整個50000行程序並獲取.o文件。 從那里,您可以將其鏈接到您的應用程序DLL與鏈接到該DLL的其他文件。

一旦將sqlite3.o構建到應用程序DLL中,其SQLite API中的符號就可以像您的其他C / C ++ DLL可用於C#/ VB程序一樣使用。

有關更多信息,請訪問www.sqlite.org/amalgamation.html。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM