Загрузка базы данных SQLite из потока байтов в .NET - PullRequest
10 голосов
/ 21 июня 2011

Я пытаюсь загрузить базу данных SQLite, которая будет встроена в мой исполняемый файл в качестве ресурса. Для тех, кто интересуется, это потому, что я использую небольшую базу данных SQLite для хранения данных конфигурации, и я хотел бы отправить конфигурацию по умолчанию, встроенную в исполняемый файл (я ненавижу иметь при себе файлы вместе с программой).

Это будет просто конфигурация по умолчанию. То есть мне не нужно изменять эту конфигурацию. Он статичен и не может быть изменен после сборки моей программы.

Я использую оболочку System.Data.SQLite для SQLite.

Я могу получить доступ к потоку байтов следующим образом:

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

Однако я в растерянности относительно создания SQLiteConnection объекта из этого потока.

Самый простой выход - просто создавать новый файл конфигурации каждый раз при загрузке программы, а затем указывать SQLite читать из этого файла. Это, вероятно, сработает, но я бы хотел избежать этого метода - я планирую повторно использовать свое решение этой проблемы, чтобы также включить поддержку интернационализации (где каждый язык представляет собой [сжатую] базу данных SQLite, а язык по умолчанию встроен в исполняемый файл - пользователь может добавить другие языки, просто скопировав другие языковые базы данных в рабочий каталог программы).

Меня не интересует стоимость памяти для хранения этой базы данных в памяти. Это будет очень мало (вероятно, менее 50 КиБ), так что это не беспокоит меня. Очевидно, что если бы это была большая база данных, это могло бы быть проблемой.

Наконец, я знаю, что это может рассматриваться как плохой способ сохранить конфигурацию. Хотя я согласен с тем, что решение на основе открытого текста подходит для случаев, когда пользователь вводит все свои настройки вручную, оно в основном будет использоваться для настроек, которые пользователь явно не определяет. Например, для хранения позиций различных стыковочных окон в приложении или для хранения данных о том, где могут быть найдены внутренние ресурсы.

Спасибо за вашу помощь.

Ответы [ 2 ]

5 голосов
/ 21 июня 2011

Похоже, что эта функция не реализована в провайдере System.Data.SQLite. Вы даже не можете сохранить базу данных в памяти в файл (то есть в двоичном формате), только в виде дампа SQL.

Таким образом, одним из решений является хранение кода SQL для создания базы данных в ресурсе. Затем создайте в памяти дб каждый раз, когда приложение запускается.

0 голосов
/ 21 июня 2011

Я полагаю, что вы хотите использовать это для строки подключения:

Data source=:memory:

См. Здесь, например: Открытие SQLiteConnection в двоичном потоке вместо файла?

...