Как я могу встроить базу данных SQLite в .NET DLL, а затем использовать ее из C #? - PullRequest
10 голосов
/ 26 апреля 2009

В настоящее время я работаю над оценкой проекта, который планирую.

Недавно я посмотрел на решения для механизма хранения данных для моего приложения и во время исследования наткнулся на SQLite. В настоящее время я использую SQLite с оболочкой System.Data.SQLite.

Мне действительно нравится, как он работает, но у меня есть одна проблема, которую я не могу исправить, и я также не нашел помощи относительно моей проблемы в Интернете.

Я бы хотел, чтобы моя база данных SQLite была встроена в одну из моих библиотек приложений (т. Е. Title.Storage.dll), которая будет использоваться внутри этой библиотеки DLL. Это возможно?

Как я могу получить доступ к базе данных?

Было бы здорово, если бы я мог использовать что-то вроде:

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

Спасибо заранее и наилучшими пожеланиями,

3Fox

Ответы [ 5 ]

14 голосов
/ 26 апреля 2009

Сборка не для хранения файлов, а для хранения кода. Хотя вы можете хранить файлы в сборке, они доступны только для чтения.

2 голосов
/ 11 ноября 2012

Это невозможно как таковое. Что вы можете сделать, это встроить базу данных в ваш проект dll и вывести ее в определенное место в файловой системе (может быть, AppData?) И читать и записывать оттуда. Использование db sit непосредственно внутри исполняемого файла (или 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 - это просто вопрос изменения dll ADO.NET (код остается прежним). Может быть так:

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;

0 голосов
/ 31 мая 2009

Я не думаю, что хранение данных в DLL - это хорошая идея, но есть грязный способ сделать это.

Чтобы загрузить данные из DLL:

  1. Используйте System.Reflection.Assembly для загрузки строки из DLL-файла. (Строка является дампом БД)
  2. Создать пустую базу данных SQLite в памяти.
  3. Использовать загруженную строку как запрос к БД для восстановления ее содержимого.

Теперь вы можете делать любые запросы в памяти.

Чтобы сохранить данные в DLL:

  1. Дамп содержимого БД в строку.
  2. Создать временный файл, содержащий SQL-дамп, завернутый в код C #.
  3. Скомпилируйте его, используя "csc" (или "gmcs" в Mono).

Это глупо, но должно работать. Надеюсь, вы никогда не будете так кодировать.

0 голосов
/ 24 мая 2009

SQLite упакован и распространяется как один C-файл с несколькими (я думаю, 3) заголовочными файлами. Это означает, что вы можете скомпилировать всю программу на 50000 строк одной командой compile и получить файл .o. Оттуда вы можете связать его с DLL вашей прикладной программы с другими файлами, которые вы связываете с этой DLL.

Как только вы встраиваете sqlite3.o в свою DLL-библиотеку приложения, символы в его API-интерфейсе SQLite становятся доступными для ваших программ так же, как и другие ваши библиотеки C / C ++ DLL становятся доступными для ваших программ на C # / VB.

Проверьте www.sqlite.org/amalgamation.html для получения дополнительной информации.

0 голосов
/ 23 мая 2009

Если вы используете NTFS, вы можете использовать альтернативный поток данных. В моем проекте мы скрываем базу данных SQLite внутри другого файла, используя альтернативный поток: DB.

...