2009-04-26 16 views
9

Tôi hiện đang làm việc trên một số công việc đánh giá cho một dự án mà tôi đang lập kế hoạch.Làm thế nào tôi có thể nhúng một Cơ sở dữ liệu SQLite trong .NET DLL và sau đó sử dụng nó từ C#?

Gần đây tôi đã xem xét các giải pháp cho cơ chế lưu trữ dữ liệu cho ứng dụng của tôi và trong khi nghiên cứu vấp ngã khi SQLite. Tôi hiện đang sử dụng SQLite với các System.Data.SQLite wrapper.

Tôi thực sự thích cách nó hoạt động nhưng tôi có một vấn đề với nó mà tôi không thể cố định và tôi cũng không tìm thấy sự trợ giúp nào liên quan đến vấn đề của tôi trên internet.

Tôi muốn Cơ sở dữ liệu SQLite của mình được nhúng vào một trong các ứng dụng DLL của tôi (ví dụ: Title.Storage.dll) được sử dụng trong tệp DLL này. Điều này có thể không?

Tôi làm cách nào để truy cập cơ sở dữ liệu?

Nó sẽ là tuyệt vời nếu tôi có thể sử dụng một cái gì đó như:

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

Cảm ơn trước Trân trọng,

3Fox

+3

này không thể nào thực hiện được. Làm thế nào bạn sẽ viết thư cho cơ sở dữ liệu? Bạn sẽ phải mở hội đồng để viết. Không trả lời vì tôi không thể cung cấp chi tiết kỹ thuật. – Will

+1

Thậm chí nếu điều này là có thể, tôi tưởng tượng nó sẽ gửi một số bộ bảo mật điên - lớn, thay đổi liên tục đến một tập tin mã. – dommer

+2

Nếu bạn có một lượng nhỏ dữ liệu * chỉ đọc * mà bạn muốn truy vấn, điều này có thể hoạt động tốt - hãy đọc tài nguyên đó vào cơ sở dữ liệu trong bộ nhớ và truy vấn nó. – Shog9

Trả lời

14

Một assembly không phải là để lưu trữ tập tin, nó cho mã lưu trữ. Trong khi bạn có thể lưu trữ các tập tin trong một hội đồng, chúng chỉ đọc.

+0

Tài nguyên chắc chắn chỉ đọc từ mã. – Will

+5

Điều gì về cơ sở dữ liệu chỉ đọc? –

1

Bạn có thể làm điều đó bằng cách đơn giản nhúng tệp dưới dạng tài nguyên, nhưng bạn cần trích xuất DB từ DLL, sau đó bạn có thể lấy tệp này và sao lưu nó vào bộ nhớ SQLite db và xóa tệp (hoặc chỉ cần mở tệp đó). Nếu bạn cần một chi tiết - hãy để lại một bình luận.

+0

Vui lòng cung cấp chi tiết. Tôi đang tìm giải pháp tương tự. Tôi muốn gửi db được sử dụng để chạy thử nghiệm. tôi muốn khám phá cả hai tùy chọn hotbackup và chỉ cần mở tập tin –

0

Nếu bạn đang sử dụng NTFS, bạn có thể sử dụng luồng dữ liệu thay thế. Trong dự án của tôi, chúng tôi ẩn cơ sở dữ liệu SQLite bên trong một tệp khác bằng cách sử dụng một luồng thay thế được gọi là: DB.

+0

điều gì sẽ xảy ra nếu tôi sao chép tệp vào phân vùng FAT32 và quay lại? – Lucas

+0

Bạn sẽ mất luồng thay thế sau khi sao chép tệp sang phân vùng FAT. – mateusza

-2

SQLite được đóng gói và phân phối dưới dạng tệp C duy nhất với một số tệp tiêu đề (3 tôi nghĩ). Điều này có nghĩa là bạn có thể biên dịch toàn bộ chương trình dòng 50000 bằng một lệnh biên dịch và nhận tệp .o. Từ đó, bạn có thể liên kết nó vào tệp DLL ứng dụng của bạn với các tệp khác mà bạn liên kết vào tệp DLL đó.

Khi bạn xây dựng sqlite3.o vào DLL ứng dụng của bạn, các biểu tượng trong API SQLite của nó sẽ có sẵn cho các chương trình của bạn giống như cách các DLL C/C++ khác của bạn có sẵn cho các chương trình C#/VB của bạn.

Khám phá www.sqlite.org/amalgamation.html để biết thêm thông tin.

+2

Đó hoàn toàn không phải là những gì tôi đã cố gắng đạt được. Tôi muốn nhúng cơ sở dữ liệu vào dll không phải là dll cho phép tôi truy cập vào nó. – chrischu

0

Tôi không nghĩ rằng lưu trữ dữ liệu trong DLL là một ý tưởng tốt, nhưng có một cách bẩn để làm điều đó.

Để tải dữ liệu từ DLL:

  1. Sử dụng System.Reflection.Assembly để tải một chuỗi từ tập tin DLL. (Chuỗi là kết xuất của DB)
  2. Tạo SQL SQLite rỗng trong bộ nhớ.
  3. Sử dụng chuỗi đã tải làm truy vấn cho DB để khôi phục nội dung của nó.

Bây giờ bạn có thể thực hiện bất kỳ truy vấn nào trong bộ nhớ.

Để lưu dữ liệu vào DLL: Nội dung DB

  1. Dump thành một chuỗi.
  2. Tạo tệp tạm thời chứa SQL-dump được gói trong mã C#.
  3. Biên dịch bằng cách sử dụng "csc" (hoặc "gmcs" trong Mono).

Thật ngu ngốc, nhưng nó sẽ hoạt động. Hy vọng bạn sẽ không bao giờ mã theo cách đó.

2

Điều này là không thể như vậy. Những gì bạn có thể làm là nhúng db trong dự án dll của bạn và đổ nó vào vị trí nhất định trên hệ thống tập tin (có thể là AppData?) Và đọc và viết từ đó. Có db ngồi trực tiếp bên trong thực thi (hoặc dlls) có thể không phải là một ý tưởng tốt trong ý nghĩa nó bloats kích thước của ứng dụng bên cạnh đó là kỹ thuật infeasible.

Có một tệp thực thi duy nhất để phân phối là một vấn đề về sở thích mà tôi thích. Trong trường hợp của bạn nhưng vấn đề là nhiều hơn. Nó không chỉ là về việc nhúng các tập tin db một mình, những gì về các dll liên kết với nó? Bước 2:

1) Thêm dlls cần thiết (System.Data.SQLite) đi kèm với db của bạn để dự án của bạn như Embedded Resource(không nhất thiết là một) và để cho hệ thống tự động giải quyết những mâu thuẫn lắp ráp?. Catch it here cách thực hiện.

2) Bây giờ hoặc là thêm tập tin db của bạn để Resources lại dự án của bạn (và giải nén nó)

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

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

hoặc thậm chí tốt hơn không nhúng các db như vậy trong dự án của bạn nhưng viết logic để tạo cơ sở dữ liệu trong ứng dụng của bạn. Điều gì xảy ra nếu ngày mai bạn cần thay đổi phiên bản SQLite, hãy nói từ 3 đến 4? Với cách tiếp cận đầu tiên, bạn cần tạo một cơ sở dữ liệu cho chính mình và nhúng lại nó trong dự án. Nhưng nếu bạn đang viết logic để tạo ra db trong ứng dụng của bạn thì việc cập nhật phiên bản SQLite chỉ là vấn đề thay đổi dll ADO.NET (mã vẫn giữ nguyên). Có thể là như thế này:

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); 
} 

Và trong chuỗi kết nối thêm FailIfMissing=False;

Các vấn đề liên quan