7

我正在部署使用vs 2008 0n XP sp3构建的winform应用程序。使用嵌入式sqlite部署winform应用程序

我创建了空模式的数据库,我放弃了在项目的根文件夹和性质选用我Build Action嵌入式资源Copy to Output directory始终复制。现在,而不是在app.config connectionString部分有连接字符串,我把一个条目在appSettingkey =“database”; value =“mydb.db;版本= 3”。

所以创建我connectionString我用:

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

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

我认为数据库应该是在应用程序的DLL因为copy always但我不能访问它。所以我到底做错了什么?

我正在怀疑我应该只是连接到不使用Application.StartupPath

根分贝的意义,但我在这里要求的最佳实践使我所做的是工作,但仍然在寻找像解决办法,所以请任何人都可以与我分享他的经验? 感谢阅读

+0

我想这是一个“嵌入文件”问题比SQLite问题更多。 – 2010-04-22 09:38:05

+1

是的,但是sqlite是最嵌入的数据库之一,所以大多数使用sqlite的人可能知道嵌入database.correct? – 2010-04-22 10:37:55

回答

5

Embedded Resource意味着数据库被嵌入到你的DLL。 Copy to output directory设置不适用于这种情况,用于Build Action: Content

嵌入数据库后,基本上必须在首次使用时取消嵌入。为此,请将它从Assembly中读出并存储到一个文件中。

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