4

我开发了一个使用 SQL Server Express 2005 数据库的 C# 4.0 桌面应用程序。我已经构建了一个安装和部署 (msi) 包,它将应用程序及其所有依赖项(包括 mdb 数据库文件)安装到 Program Files 目录下的工作文件夹中。

连接字符串是这样的:

Server=.\SQLExpress;AttachDbFilename=|DataDirectory|MyDB.mdf;Database=MyDB;integrated security=true;user instance=true;

第一次进行数据库调用时,数据库将连接到本地 SQL Server Express 实例。

安装程序在 XP 计算机上按预期工作,但是,在 Windows 7 计算机上进行测试时,第一次进行数据库调用时会引发异常,这表明对包含 mdb 文件的文件夹没有足够的权限。

在 Windows XP 和 Windows 7 之间,Windows 似乎已经锁定了 Program Files 子文件夹的权限。我可以通过设置安装目录的完全权限来解决这个问题,但这似乎是作弊。

所以我的问题是:我应该如何为这个应用程序配置设置和部署包?我做对了吗?我是否只需要向应用程序目录上的所有用户授予完全权限?如果是这样,我如何使用 VS2010 设置和部署包来实现这一点?或者我应该把 mdb 文件放在别的地方吗?还是我完全以错误的方式做事?

4

2 回答 2

3

这是我最终实施的完整解决方案。

  • 在 Setup and Deployment 项目的 File System 部分,我将 SQL Server 数据库文件 (MDF) 添加到 Common Application Data 文件夹。这不是[右键单击]目标机器上的文件系统\添加特殊文件夹菜单中的可选选项之一(出于某种原因),因此我必须从该菜单中选择自定义文件夹,然后在默认位置属性中,输入“[ CommonAppDataFolder][制造商][产品名称]”。这在 Common Application Data 文件夹中创建了一个文件夹,无论它在我的产品的目标计算机上的任何位置(C:\Program Data\ for Win 7)。
  • 我需要所有用户都能够完全访问此文件夹,以便 SQL Server 数据库文件成功附加并正常工作,因此下一步是更改此文件夹的权限。
  • 我能找到的唯一方法是为安装和部署项目编写自定义操作。此链接很好地说明了如何创建和添加自定义操作:http ://thedotnetway.blogspot.com.au/2008/10/creating-setup-project-in-vs-2008-w.html
  • 此链接提供了需要放入自定义操作覆盖的安装方法的代码: C# - 在 Windows 7 中为所有用户设置目录权限
  • 我在自定义操作代码中使用 System.Environment.GetFolderPath(System.Environment.SpecialFolder.CommonApplicationData) 来指定 Common Application Data 文件夹。

希望这能让未来有类似要求的任何开发人员的生活更轻松。

于 2012-06-26T03:37:25.523 回答
2

有几种方法可以补救这种情况。

  1. 如果您的应用程序仅执行从程序文件中读取文件。您只需要在管理员权限下运行安装程序包(右键单击它,然后选择以管理员身份运行)。您的数据库将被写入预期的位置。

  2. 如果您需要对文件执行 IO 操作(读/写),则需要将所有文件放到 Program Data 文件夹中

    Environment.GetFolderPath(Environment.SpecialFolder.CommonApplicationData)

或当前用户的数据文件夹

**Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData)**

干杯。

于 2012-06-21T04:24:21.843 回答