Я развертываю приложение winform, созданное с по сравнению с 0n XP sp3 2008 года.
Я создал базу данных с пустой схемой, которая я заглядывал корневой папке проекта и в свойствах i choosed Build Action
: Встроенные ресурсы и Copy to Output directory
: Копируйте всегда. Теперь вместо того, чтобы иметь connectionstring в разделе app.config connectionString, я вставил запись appSetting
: key
= "база данных";value
= "mydb.db; Version=3".
Таким образом создать мой connectionString
я использовал:
SQLiteConnection con = new SQLiteConnection("Data Source=" + Path.Combine(Application.StartupPath, ConfigurationManager.AppSettings["database"]));
Все хорошо работает, и я упаковал приложение с проектом установки. Теперь после того, как я установил приложение, которым не могла быть найдена база данных, и я был обязан скопировать базу данных в Application Folder
в проекте установки для него для работы.
то, что я думал, - то, что дб, как предполагается, находится в приложении dll из-за copy always
.but я не могу получить доступ к нему. Таким образом, что точно я делал неправильно?
я подозреваю, что должен был просто соединиться с корневым дб, означающим не использование Application.StartupPath
Но я здесь спрашиваю по причине лучших практик, что я сделал работает, но все еще похож на обходное решение поэтому, кто-либо может обменяться его опытом со мной? благодарит читать
Встроенный ресурс
означает, что база данных встраивается в вашу dll. Параметр Копировать в выходной каталог
не применяется в этом случае, он используется для Действие сборки: Контент
.
Со встроенной базой данных вам, по сути, нужно отключить ее при первом использовании. Для этого прочтите его из сборки и сохраните в файл.
class EmbeddedResourceTest
{
public static void Test()
{
string path = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), "Test.db");
using(var resourceStream = typeof(EmbeddedResourceTest).Assembly.GetManifestResourceStream("Test.db"))
{
using(var fileStream = File.OpenWrite(path))
{
CopyStream(resourceStream, fileStream);
}
}
// now access database using 'path'
}
public static void CopyStream(Stream inputStream, Stream outputStream)
{
CopyStream(inputStream, outputStream, 4096);
}
public static void CopyStream(Stream inputStream, Stream outputStream, int bufferLength)
{
var buffer = new byte[bufferLength];
int bytesRead;
while ((bytesRead = inputStream.Read(buffer, 0, bufferLength)) > 0)
{
outputStream.Write(buffer, 0, bytesRead);
}
}
}