有关生成操作的说明

本文关键字:说明 操作 | 更新日期: 2023-09-27 18:34:50

>我有一个使用Access DB文件作为引用表的项目。 这是在工作中使用的,但我正在家里开发它。 到目前为止,我只是在VS2010中运行调试器,然后将相关的类文件,exe等从/bin文件夹复制到闪存驱动器,并且工作正常。 但是随着数据库的加入,它在启动时突然崩溃。

我知道问题是数据库文件的文件位置。 最初,数据库的构建操作被发送到内容。 我已将其更改为嵌入式资源,据我了解,这意味着它现在将成为exe文件的一部分。

我说的对吗? 如果没有,我需要选择什么选项才能使数据库仅成为 exe 的编译部分或其他 dll 的一部分?

有关生成操作的说明

如果嵌入

了数据库文件,则无法访问它以添加/删除行等。为什么将生成操作更改为"嵌入资源"?最好放作为内容,所以数据库是一个与exe不同的文件(但仍然在同一个目录中(,然后构建数据库文件的路径(即使用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 中的干净数据库包覆盖(