【问题标题】:Replacing an MDB file at runtime在运行时替换 MDB 文件
【发布时间】:2010-10-20 03:27:32
【问题描述】:

我的应用程序读取一个 Access 数据库文件,该文件可以在运行时通过下载替换 MDB 文件(具有相同架构)并覆盖现有文件来更新。在开发过程中这一切都很好,但在部署过程中就中断了。

主要问题是数据适配器的连接字符串是

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ModelDatabase.mdb"

其中|DataDirectory|令牌通常等于应用程序根目录。当我下载一个新文件并尝试删除现有的 MDB 文件时,Vista 不喜欢它——UnauthorizedAccessException 被抛出,这是正确的,因为我不应该弄乱应用程序根目录中的文件。

相反,我应该下载和更新应用程序数据目录中的文件,例如Application.CommonAppDataPath

所以,我面临两种可能的解决方案(按优先顺序):

  1. 以某种方式重新定义 |DataDirectory|指向Application.CommonAppDataPath 的令牌。我试过AppDomain.CurrentDomain.SetData("DataDirectory", Application.CommonAppDataPath) 没有运气;数据适配器引发异常“键‘数据源’的值无效。”当它尝试填充 DataSet 时。

  2. 以编程方式更新数据集,使用特定的数据适配器填充每个表,然后插入、更新和删除数据行。当一个简单的文件移动就足够时,这似乎是一种可怕的痛苦。

有没有办法通过重新定义这个神奇的 DataDirectory 令牌来使解决方案 #1 起作用?无论如何,这个域变量是在哪里定义的?

或者有没有更好的方法来解决这个问题?

【问题讨论】:

  • 您确定没有抛出异常,因为您在应用程序中打开了文件?
  • 我很确定情况就是这样。我能够复制该问题的唯一方法是在 Windows 7 框中,每当您尝试更改“Program Files (x86)”中的文件时,它都会弹出一个权限对话框。

标签: .net winforms .net-4.0


【解决方案1】:

啊!我想通了。

解决办法,其实就是调用

AppDomain.CurrentDomain.SetData("DataDirectory", Application.CommonAppDataPath)

问题在于程序集的公司名称以“Inc.”结尾,因此应用数据路径中的目录名称之一以句点字符结尾。数据连接似乎不喜欢这种行为。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多