使用嵌入式sqlite部署winform应用程序

bla*_*sei 7 sqlite deployment embedded-database visual-studio-2008 winforms

我正在部署使用vs 2008 0n XP sp3构建的winform应用程序.

我创建了一个空模式的数据库,我将其放在项目的根文件夹和我选择的属性中Build Action:嵌入式资源Copy to Output directory:始终复制.现在,我没有在app.config connectionString部分中使用connectionstring,而是将条目放在appSetting:key="database"; value= "mydb.db;版本= 3".

所以要创建我connectionString使用的:

 SQLiteConnection con = new SQLiteConnection("Data Source=" + Path.Combine(Application.StartupPath, ConfigurationManager.AppSettings["database"]));
Run Code Online (Sandbox Code Playgroud)

一切正常,我用一个安装项目打包应用程序.现在我安装了应用程序之后无法找到数据库,我不得不将数据库复制到Application Folder安装项目中以使其工作.

我认为db应该是在应用程序DLL中因为.copy always但我无法访问它.所以我究竟做错了什么?

我怀疑我应该只是连接到根db意味着不使用 Application.StartupPath

但我在这里要求最好的做法因为我所做的工作但仍然看起来像是解决方法所以请有人可以与我分享他的经验吗?谢谢阅读

Sam*_*eff 5

Embedded Resource表示数据库嵌入到您的dll中.Copy to output directory在这种情况下,该设置不适用于此Build Action: Content.

嵌入数据库后,您基本上必须在首次使用时取消嵌入.为此,请将其从程序集中读出并将其存储到文件中.

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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)