развертывание приложения winform со встроенным sqlite

Я развертываю приложение 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

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

7
задан black sensei 22 April 2010 в 10:35
поделиться

1 ответ

Встроенный ресурс означает, что база данных встраивается в вашу 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);
        }
    }
}
5
ответ дан 7 December 2019 в 12:17
поделиться
Другие вопросы по тегам:

Похожие вопросы: