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); 
     } 
    } 
} 
相關問題