2011-06-20 7 views
9

Próbuję załadować bazę danych SQLite, która będzie osadzona w moim pliku wykonywalnym jako zasób. Dla tych, którzy są ciekawi, to dlatego, że używam małej bazy danych SQLite do przechowywania danych konfiguracyjnych i chciałbym wysłać domyślną konfigurację osadzoną wewnątrz pliku wykonywalnego (nie cierpię konieczności przenoszenia plików wraz z programem).Ładowanie bazy danych SQLite ze strumienia bajtów w .NET

To byłaby domyślna konfiguracja. To znaczy, nie muszę modyfikować tej konfiguracji. Jest statyczny i nie można go zmienić po zbudowaniu mojego programu.

Używam opakowania System.Data.SQLite dla SQLite.

mogę uzyskać dostęp do strumienia bajtów tak:

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

Jestem jednak ze stratą w odniesieniu do tworzenia SQLiteConnection obiekt z tego strumienia.

Łatwym wyjściem byłoby po prostu odrodzenie nowego pliku konfiguracyjnego za każdym razem, gdy program się załaduje, a następnie nakazanie SQLite odczytania z tego pliku. Prawdopodobnie zadziałałoby, ale chciałbym uniknąć tej techniki - planuję ponowne wykorzystanie mojego rozwiązania tego problemu, aby włączyć obsługę internacjonalizacji (gdzie każdy język jest skompresowaną bazą danych SQLite, a domyślny język jest osadzony w pliku wykonywalnym - a użytkownik mógł dodać inne języki, po prostu kopiując bazy danych innych języków do katalogu roboczego programu).

Nie interesuje mnie koszt pamięci posiadania tej bazy danych w pamięci. Będzie bardzo mały (prawdopodobnie mniej niż 50 KiB), więc nie przeszkadza mi to. Oczywiście, gdyby była to większa baza danych, może to być problem.

Wreszcie, jestem świadomy, że może to być postrzegane jako zły sposób przechowywania konfiguracji. Chociaż zgadzam się, że rozwiązanie oparte na zwykłym tekście jest dobre dla przypadków, w których użytkownik wprowadza wszystkie swoje ustawienia ręcznie, będzie to najczęściej używane w przypadku ustawień, których użytkownik nie definiuje jawnie. Na przykład, aby przechowywać pozycje różnych okien dokowania w aplikacji lub przechowywać dane o tym, gdzie można znaleźć zasoby wewnętrzne.

Dziękuję za pomoc.

+0

7 lat później i zastanawiasz się, czy kiedykolwiek masz rozwiązanie tego, które pozwoliło ci zapisać sql lite db do pliku binarnego z pamięci lub załadować go ze strumienia? – lucuma

Odpowiedz

5

Wydaje się ta funkcjonalność nie jest inmplemented w dostawcy System.Data.SQLite. Nie można nawet zapisać bazy danych w pamięci do pliku (tj. W formacie binarnym), tylko w formie zrzutu SQL.

Jednym z rozwiązań jest przechowywanie kodu SQL do tworzenia bazy danych w zasobie. Następnie utwórz db w pamięci za każdym razem, gdy uruchomi się aplikacja.

+0

Rozważałem to, i wydaje mi się, że to jedyna droga. Tak czy inaczej, nie powinno to być strasznie duże: chciałem spróbować skompresować zasób tak czy inaczej (ponieważ bazy danych SQLite z dużą ilością tekstu wydają się ładnie kompresować). – Ethan

0

wierzę chcesz użyć tego do ciągu połączenia:

Data source=:memory: 

Zobacz tutaj na przykład: Opening a SQLiteConnection on a binary stream instead of a file?

+3

Tak, i byłoby dobrze, gdybym chciał zacząć od pustej bazy danych. Ale w tym przypadku mam istniejący strumień binarny, który chciałbym, aby był czytany jako baza danych, a nie po prostu otwierając nowy. – Ethan

+0

@Ethan: Nic nie widzę w przykładzie, który napisałem o tym, że jest to pusta baza danych.Ale szczerze mówiąc, nigdy wcześniej nie używałam SQLite i starałam się tylko pomóc, więc może nie wiem, o czym mówię :) – mellamokb

+0

Cóż, być może istnieje sposób, aby to zrobić, ale problem z twoim przykładem jest to, że nie ma gdzie przekazać strumień binarny. Jeśli był to kod niezarządzany, mógłbym zrobić coś niedorzecznego, np. Ręcznie przekazać adres/rozmiar strumienia w pamięci, ale jestem prawie pewien, że nie jest to możliwe w .NET. – Ethan

Powiązane problemy