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

Posted

技术标签:

【中文标题】使用嵌入式 sqlite 部署 winform 应用程序【英文标题】:deploying winform application with embedded sqlite 【发布时间】:2010-04-22 09:32:53 【问题描述】:

我正在部署一个用 vs 2008 0n XP sp3 构建的 winform 应用程序。

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

所以要创建我的connectionString 我使用了:

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

一切正常,我将应用程序与安装项目打包在一起。现在,在我安装应用程序后,找不到数据库,我不得不将数据库复制到安装项目中的 Application Folder 以使其正常工作。

我认为 db 应该在应用程序 dll 中,因为 copy always 。但我无法访问它。那么我到底做错了什么?

我怀疑我应该刚刚连接到根数据库,这意味着不使用Application.StartupPath

但我在这里寻求最佳实践,因为我所做的工作有效但看起来仍然像解决方法,所以请任何人都可以与我分享他的经验吗? 感谢阅读

【问题讨论】:

我猜这更像是一个“嵌入文件”问题而不是 SQLite 问题。 是的。但是 sqlite 是最嵌入的数据库之一,所以大多数使用 sqlite 的人可能知道嵌入数据库。对吗? 【参考方案1】:

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);
        
    

【讨论】:

以上是关于使用嵌入式 sqlite 部署 winform 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

防止SQLite Magellan破坏您的应用程序

防止SQLite Magellan破坏您的应用程序

在winform嵌入外部应用程序

Android数据存储之SQLite数据库

如何以编程方式更新始终运行并使用 msix 部署的 WinForms 应用程序?

使用 SQLite 和 WinForms 2.0 C# 的编码问题