【问题标题】:Clarification on Build Action关于构建操作的说明
【发布时间】:2012-05-28 14:51:05
【问题描述】:

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

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

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

【问题讨论】:

    标签: c# wpf build embedded-resource


    【解决方案1】:

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

    【讨论】:

    • 澄清一下,我不需要访问数据库来添加或删除行,它纯粹是一个参考数据库。它存储邮政编码、区号及其对应的位置。那么考虑到这一点,嵌入式资源是否成为一个好的或足够的选择?
    • 如果它包含数据,我想你需要使用这些数据。所以你需要访问数据库。要访问它,您需要从 Embedded Resource 中提取它并将其保存为单独的文件。
    • 好的,感谢您的澄清。我刚刚发现实际问题是 OleDB 没有在机器上注册
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-29
    • 2019-05-06
    相关资源
    最近更新 更多