2012-05-22 111 views
2

我有一個使用Access DB文件作爲參考表的項目。這是爲了在工作中使用,但我正在家中開發它。直到現在,我只是在VS2010中運行調試器,然後將相關的類文件,exe等從/ bin文件夾複製到閃存驅動器,並且工作正常。但隨着DB的加入,它在發佈時突然崩潰。關於構建操作的說明

我知道問題是數據庫文件的文件位置。最初,數據庫的構建行爲已發送到內容。我已將其更改爲嵌入式資源,據我瞭解,這意味着它現在將成爲exe文件的一部分。

我正確嗎?如果沒有,我需要選擇什麼樣的選項才能使DB成爲exe的一部分,或者是其他dll的一部分?

回答

2

如果db文件已嵌入,則無法訪問它以添加/刪除行等。 爲什麼要將構建操作更改爲Embedded Resource?將內容放在內容中會更好,因此db是一個與exe不同的文件(但仍位於同一目錄中),然後構建db文件的路徑(即使用Application.StartupPath)。

無論如何,如果你想將它設置爲嵌入式,你需要在運行時提取數據庫,並在使用之前將它存儲在某個地方。

這裏是可以提取嵌入的資源文件(當然,您需要更改文件名,或者把它作爲參數)的方法:

private void ExtractFromAssembly() 
{ 
    string strPath = Application.LocalUserAppDataPath + "\\MyFile.db"; 
    if (File.Exists(strPath)) return; // already exist, don't overwrite 
    Assembly assembly = Assembly.GetExecutingAssembly(); 
    //In the next line you should provide NameSpace.FileName.Extension that you have embedded 
    var input = assembly.GetManifestResourceStream("MyFile.db"); 
    var output = File.Open(strPath, FileMode.CreateNew); 
    CopyStream(input, output); 
    input.Dispose(); 
    output.Dispose(); 
    System.Diagnostics.Process.Start(strPath); 
} 

private void CopyStream(Stream input, Stream output) 
{ 
    byte[] buffer = new byte[32768]; 
    while (true) 
    { 
     int read = input.Read(buffer, 0, buffer.Length); 
     if (read <= 0) 
      return; 
     output.Write(buffer, 0, read); 
    } 
} 

該文件將在被複制本地應用程序路徑,位於用戶目錄中。這將在應用程序第一次啓動時完成,否則db文件將在每次啓動應用程序時被覆蓋(用exe中的clean db軟件包覆蓋)

+0

爲了說明,我不需要訪問數據庫添加或刪除行,它純粹是一個參考數據庫。它存儲郵政編碼,地區代碼及其相應的位置。因此,鑑於此方面,嵌入式資源是否成爲一個好的或充足的選擇? –

+1

如果它包含數據,我想你需要使用這些數據。所以你需要訪問數據庫。要訪問它,您需要從Embedded Resource中提取它並將其另存爲一個單獨的文件。 – Fabske

+0

好的,謝謝你的澄清。我剛剛發現實際問題是OleDB沒有在機器上註冊 –