为 64 位 Windows 计算机创建生成时出现"Access to database file is not allowed"错误



我正在创建一个新版本的现有Windows桌面应用程序,该应用程序已经运行了好几年。该应用程序使用SqlServerCe数据库,该数据库安装在计算机的DataDirectory中。该应用程序的新版本是为了与64位机器兼容而创建的。我已经将代码迁移到我的Macbook上运行Windows 10的Parallels虚拟机上,我正在使用Visual Studio 2017构建新版本。构建工作正常(我正在使用安装向导项目来创建安装文件)。但是,当我安装应用程序时,我在第一次尝试访问数据库时出错。

错误为:不允许访问数据库文件。[1884,文件名=C:\ProgramData\CompanyName\ApplicationName\AppDataBase.sdf,SeCreateFile]。

.sdf未标记为只读。如果我在安装.sdf文件后转到该文件,并将读取、写入和修改权限授予Everyone(使用文件资源管理器),则应用程序可以访问该文件,并且不会出错。但是,如果我尝试使用File.SetAccessControl在代码中执行此操作,我会再次出现访问错误。在安装过程中,我看不出有任何方法可以使用安装向导功能(文件系统视图)设置.sdf文件的权限。

这是我正在使用的连接字符串:

<connectionStrings>
<add name="ApplicationName.Properties.Settings.ApplicationNameConnectionString"
connectionString="Data Source=|DataDirectory|AppDataBase.sdf"
providerName="Microsoft.SqlServerCe.Client.4.0" />
</connectionStrings>

当使用Visual Studio 2010进行构建并在x86计算机上进行部署时,这一功能运行良好。提前感谢您的建议。

听起来可能是UAC

请确保您正在运行exe(而不是msi),并且在安装程序项目的LaunchConditions中已将Privileged设置为true

此外,请确保您通过右键单击并选择"以管理员身份运行"来运行应用程序

本质上,您的位置是错误的。默认情况下,Windows 7(及更高版本)的文件夹%SystemDrive%ProgramDataMyCompanyMyApp对于非管理员用户是只读的,应该用于机器配置。我建议你阅读

https://blogs.msdn.microsoft.com/patricka/2010/03/18/where-should-i-store-my-data-and-configuration-files-if-i-target-multiple-os-versions/

正确的位置(我假设它是应该在多个用户之间共享的数据库文件)是每台机器的"文档">

用户在跨用户使用的应用程序。这些通常是模板或公共文件。

示例:MyTemplate.dot

Windows 7:C:\Users\Public

Vista:%SystemDrive%\Users\Public

XP:%ALLUSERSPROFILE%\Documents

环境变量:

Vista/Win7:%PUBLIC%注意:XP上不存在

已知文件夹ID:FOLDERID_PublicDocuments

System.Environment.SpecialFolder:System.Environment.SpecicalFolder.CommonDocuments

CSIDL:CSIDL_COMMON_DOCUMENTS

为什么不简单地使用%APPDATA%?

最新更新