2

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

我知道问题是数据库文件的文件位置。最初 DB 的 Build Action 被发送到 Content。我已将其更改为 Embedded Resource,据我所知,这意味着它将成为 exe 文件的一部分。

我在这方面是正确的吗?如果不是,我需要选择什么选项才能让数据库成为 exe 的编译部分或其他 dll 之一?

4

1 回答 1

2

如果嵌入了 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 包覆盖)

于 2012-05-22T06:20:14.143 回答