【发布时间】: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。
所以,我面临两种可能的解决方案(按优先顺序):
以某种方式重新定义 |DataDirectory|指向
Application.CommonAppDataPath的令牌。我试过AppDomain.CurrentDomain.SetData("DataDirectory", Application.CommonAppDataPath)没有运气;数据适配器引发异常“键‘数据源’的值无效。”当它尝试填充 DataSet 时。以编程方式更新数据集,使用特定的数据适配器填充每个表,然后插入、更新和删除数据行。当一个简单的文件移动就足够时,这似乎是一种可怕的痛苦。
有没有办法通过重新定义这个神奇的 DataDirectory 令牌来使解决方案 #1 起作用?无论如何,这个域变量是在哪里定义的?
或者有没有更好的方法来解决这个问题?
【问题讨论】:
-
您确定没有抛出异常,因为您在应用程序中打开了文件?
-
我很确定情况就是这样。我能够复制该问题的唯一方法是在 Windows 7 框中,每当您尝试更改“Program Files (x86)”中的文件时,它都会弹出一个权限对话框。