如果嵌入了 db 文件,则无法访问它来添加/删除行等。为什么将构建操作更改为 Embedded Resource ?作为Content 会更好,所以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 包覆盖)