2011-06-20 13 views
9

Tôi đang cố tải một cơ sở dữ liệu SQLite sẽ được nhúng vào tệp thực thi của tôi dưới dạng tài nguyên. Đối với những người tò mò, đó là vì tôi sử dụng một cơ sở dữ liệu SQLite nhỏ để lưu trữ dữ liệu cấu hình và tôi muốn gửi cấu hình mặc định được nhúng bên trong tệp thực thi (tôi ghét phải mang theo tệp cùng với một chương trình).Đang tải cơ sở dữ liệu SQLite từ luồng byte trong .NET

Đây chỉ là cấu hình mặc định. Đó là, tôi không cần phải sửa đổi cấu hình này. Nó là tĩnh và không thể thay đổi sau khi chương trình của tôi đã được xây dựng.

Tôi đang sử dụng trình bao bọc System.Data.SQLite cho SQLite.

tôi có thể nhận được quyền truy cập vào một dòng byte như thế này:

using (var stream = 
      Assembly.GetExecutingAssembly().GetManifestResourceStream(resourceName)) { 
    // use of "stream" here. 
} 

Tuy nhiên, tôi đang ở một mất mát liên quan đến việc tạo ra một đối tượng SQLiteConnection từ dòng này.

Cách dễ dàng nhất là chỉ sinh ra tệp cấu hình mới mỗi khi chương trình tải, sau đó yêu cầu SQLite đọc từ tệp đó. Điều này có thể làm việc, nhưng tôi muốn tránh kỹ thuật đó - tôi dự định sử dụng lại giải pháp của mình cho vấn đề này cũng bao gồm hỗ trợ quốc tế hóa (mỗi ngôn ngữ là một cơ sở dữ liệu SQLite nén) và ngôn ngữ mặc định được nhúng trong tệp thực thi người dùng có thể thêm các ngôn ngữ khác của tôi chỉ đơn giản là sao chép cơ sở dữ liệu ngôn ngữ khác vào thư mục làm việc của chương trình).

Tôi không quan tâm đến chi phí bộ nhớ khi giữ cơ sở dữ liệu này trong bộ nhớ. Nó sẽ rất nhỏ (có thể ít hơn 50 KiB), vì vậy mà không làm phiền tôi. Rõ ràng nếu đây là một cơ sở dữ liệu lớn hơn, điều này có thể là một vấn đề.

Cuối cùng, tôi biết rằng điều này có thể được xem là cách kém để lưu trữ cấu hình. Mặc dù tôi đồng ý rằng giải pháp dựa trên văn bản thuần túy là tốt cho các trường hợp khi người dùng nhập tất cả cài đặt của mình theo cách thủ công, điều này chủ yếu được sử dụng cho cài đặt mà người dùng không xác định rõ ràng. Ví dụ, để lưu trữ các vị trí của các cửa sổ ghép nối khác nhau trong một ứng dụng, hoặc để lưu trữ dữ liệu về nơi các nguồn nội bộ có thể được tìm thấy.

Cảm ơn sự giúp đỡ của bạn.

+0

7 năm sau và tự hỏi liệu bạn có bao giờ có giải pháp cho phép bạn lưu một db lite sql vào nhị phân từ bộ nhớ hoặc tải nó từ luồng không? – lucuma

Trả lời

5

Có vẻ như tính năng này không được inmplemented trong một nhà cung cấp System.Data.SQLite. Bạn thậm chí không thể lưu cơ sở dữ liệu trong bộ nhớ vào một tệp (tức là ở định dạng nhị phân), chỉ dưới dạng một kết xuất SQL.

Vì vậy, một trong các giải pháp là lưu trữ mã SQL để tạo cơ sở dữ liệu trong tài nguyên. Sau đó, tạo ra trong bộ nhớ db mỗi khi ứng dụng khởi động.

+0

Tôi đã xem xét điều đó, và tại thời điểm này nó có vẻ như là cách duy nhất để đi. Dù bằng cách nào, nó không phải là terribly lớn: Tôi đã cố gắng để nén anyways tài nguyên (kể từ khi cơ sở dữ liệu SQLite với rất nhiều văn bản dường như nén độc đáo). – Ethan

0

Tôi tin rằng bạn muốn sử dụng này cho chuỗi kết nối của bạn:

Data source=:memory: 

Xem ở đây ví dụ: Opening a SQLiteConnection on a binary stream instead of a file?

+3

Có, và điều đó sẽ tốt nếu tôi muốn bắt đầu với một cơ sở dữ liệu trống. Nhưng trong trường hợp này, tôi có một luồng nhị phân hiện có mà tôi muốn nó đọc như một cơ sở dữ liệu, thay vì chỉ đơn giản là mở một tệp mới. – Ethan

+0

@Ethan: Tôi không thấy bất kỳ điều gì trong ví dụ tôi đăng về việc này là cơ sở dữ liệu trống.Nhưng thành thật mà nói, tôi chưa bao giờ thực sự sử dụng SQLite trước đây và chỉ cố gắng giúp đỡ, vì vậy tôi có thể không biết những gì tôi đang nói về :) – mellamokb

+0

Vâng, có lẽ có một cách để làm điều đó, nhưng vấn đề với bạn ví dụ là không có nơi nào để tôi vượt qua luồng nhị phân. Nếu đây không phải là mã không được quản lý, tôi có thể làm điều gì đó vô lý, giống như tự chuyển địa chỉ/kích thước của luồng trong bộ nhớ, nhưng tôi khá chắc chắn rằng không thể thực hiện được trong .NET. – Ethan