.net 在运行时替换MDB文件

.net 在运行时替换MDB文件,.net,winforms,.net-4.0,.net,Winforms,.net 4.0,我的应用程序读取Access数据库文件,该文件可以在运行时通过下载具有相同架构的替换MDB文件并覆盖现有文件进行更新。在开发过程中,这一切都很好,但在部署过程中会中断 主要问题是数据适配器的连接字符串不正确 "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ModelDatabase.mdb" 其中| DataDirectory |标记通常等于应用程序根目录。Vista不喜欢我下载一个新文件并尝试删除现有MDB文件——会

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

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

"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=|DataDirectory|\ModelDatabase.mdb"
其中| DataDirectory |标记通常等于应用程序根目录。Vista不喜欢我下载一个新文件并尝试删除现有MDB文件——会抛出UnauthorizedAccessException,这是理所当然的,因为我不应该弄乱应用程序根目录中的文件

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

因此,我面临两种可能的解决方案,按优先顺序排列:

以某种方式重新定义| DataDirectory |标记以指向Application.CommonAppDataPath。我尝试了AppDomain.CurrentDomain.setdatadirectory,Application.CommonAppDataPath,但没有成功;数据适配器为键“数据源”引发异常无效值。当它尝试填充数据集时

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

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

还是有更好的方法来解决这个问题?

Gah!我想出来了

事实上,解决办法是打电话

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

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

您确定不会因为在应用程序中打开了文件而引发异常吗?我很确定是这样的。我能够复制这个问题的唯一方法是在Windows7对话框上,每当您试图更改x86程序文件中的文件时,它都会弹出一个权限对话框。