Интеграция SQLite с приложением Windows

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

Я хочу распространить это простое приложение, поэтому я создал файл setup.exe для приложения, создав новый проект и используя мастер установки на VS2010. Когда пользователь устанавливает приложение, он создает папку "TestDatabase" в каталоге Program Files и добавляет эти два файла вместе с файлом.exe:

  1. Файл System.Data.SQLite.DLL (так как это обнаруженная зависимость)
  2. Файл TestDatabase.s3db (тестовая база данных для пользователя)

Когда я устанавливаю его на компьютер, на котором я работаю... все работает. Однако при установке на другом компьютере происходит сбой при попытке открыть базу данных из приложения (которая хранится в C:\Program Files (x86)\TestDatabase\TestDatabase.s3db).

Мне было интересно, если кто-то может помочь решить эту проблему? Благодарю.

5 ответов

Решение

Я понял, что причина его сбоя при открытии базы данных заключается в том, что я не установил установочный пакет на новый компьютер, на котором я тестировал. Пакет установки включает в себя все компоненты и зависимости времени выполнения. Установочные пакеты можно найти здесь:

http://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Кроме того, ravenspoint, RandomEngy и bryanbcook... вы, ребята, были правы. Чтение / запись базы данных из папки Program Files - плохая идея из-за проблем с правами доступа, которые могут возникнуть при доступе к базе данных из папки Program Files. Поэтому я сохранил свою базу данных в папке AppData, где база данных может быть прочитана / записана без каких-либо проблем с разрешениями.

Вы не можете изменять файлы в Program Files каталог, если вы работаете в режиме администратора. Вы должны развернуть файл.s3db в папку внутри %appdata% вместо.

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

<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite" />
    <add name="SQLite Data Provider" 
      invariant="System.Data.SQLite" 
      description=".Net Framework Data Provider for SQLite" 
      type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
  </DbProviderFactories>
</system.data>

И вам нужно убедиться, что вы установили "Copy local" равным true в вашей ссылке на сборку, чтобы сборка SQLite была включена в ваш проект \bin и setup.

Может быть проблема с разрешениями. Возможно, вы захотите использовать изолированное хранилище для этого.

Также может быть, что ваш проект использует сборки из GAC. Убедитесь, что ваши сборки локальны для вашего проекта.

Проблема в том, что у вашего пользователя нет прав на запись в папку Program Files. Быстрое решение заключается в установке тестового файла БД в

C:/Program Data/<your company name>/<your application name>/

Однако не рекомендуется использовать установщик для переноса файлов базы данных в определенные папки. У вас возникнут проблемы, когда вы захотите распространить обновленные приложения пользователям, которые установили предыдущую версию. Лучше написать код в вашем приложении, который ищет базу данных и создает новую, если она не найдена. Таким образом, обновленное приложение может использовать базу данных, которая была сгенерирована предыдущей версией, и, следовательно, может представлять значительный объем инвестиций пользователя.

Подробнее о том, как подробно обрабатывать обновления приложений, управляемые базой данных, см. В разделе Как управлять версиями файловых баз данных рабочего стола?

Другие вопросы по тегам