如果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軟件包覆蓋)
爲了說明,我不需要訪問數據庫添加或刪除行,它純粹是一個參考數據庫。它存儲郵政編碼,地區代碼及其相應的位置。因此,鑑於此方面,嵌入式資源是否成爲一個好的或充足的選擇? –
如果它包含數據,我想你需要使用這些數據。所以你需要訪問數據庫。要訪問它,您需要從Embedded Resource中提取它並將其另存爲一個單獨的文件。 – Fabske
好的,謝謝你的澄清。我剛剛發現實際問題是OleDB沒有在機器上註冊 –