Интеграция SQLite с приложением Windows
Поэтому я создал простое приложение WPF, которое позволяет пользователю вставлять строку в базу данных SQLite (файл.S3DB). Пользователь также может выбрать строку из базы данных и удалить строку из базы данных... очень простое приложение.
Я хочу распространить это простое приложение, поэтому я создал файл setup.exe для приложения, создав новый проект и используя мастер установки на VS2010. Когда пользователь устанавливает приложение, он создает папку "TestDatabase" в каталоге Program Files и добавляет эти два файла вместе с файлом.exe:
- Файл System.Data.SQLite.DLL (так как это обнаруженная зависимость)
- Файл 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>/
Однако не рекомендуется использовать установщик для переноса файлов базы данных в определенные папки. У вас возникнут проблемы, когда вы захотите распространить обновленные приложения пользователям, которые установили предыдущую версию. Лучше написать код в вашем приложении, который ищет базу данных и создает новую, если она не найдена. Таким образом, обновленное приложение может использовать базу данных, которая была сгенерирована предыдущей версией, и, следовательно, может представлять значительный объем инвестиций пользователя.
Подробнее о том, как подробно обрабатывать обновления приложений, управляемые базой данных, см. В разделе Как управлять версиями файловых баз данных рабочего стола?