代码之家  ›  专栏  ›  技术社区  ›  black sensei

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

  •  7
  • black sensei  · 技术社区  · 16 年前

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

    Build Action : 嵌入式资源 Copy to Output directory 总是复制 . 而不是在应用程序配置连接字符串部分,我在 appSetting key =“数据库”; value ="我的数据库.db;版本=3“。

    connectionString 我用过:

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

    一切正常,我打包了一个安装程序的应用程序项目。现在安装应用程序后,找不到数据库,我不得不将数据库复制到 Application Folder 在安装项目中。

    copy always 。但我无法访问是的。所以呢我到底做错了什么?

    我怀疑我应该连接到根db,意思是不使用 Application.StartupPath

    但我在这里要求的最佳做法,因为我所做的是工作,但仍然像变通办法,所以请有人能与我分享他的经验? 谢谢你的阅读

    1 回复  |  直到 16 年前
        1
  •  5
  •   Samuel Neff    16 年前

    Embedded Resource 意味着数据库被嵌入到你的动态链接库中。这个 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);
            }
        }
    }
    
    推荐文章