我正在创建一个新版本的现有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%?