C# 获得;“不允许访问数据库文件”;为64位windows计算机创建生成时出错

C# 获得;“不允许访问数据库文件”;为64位windows计算机创建生成时出错,c#,windows,visual-studio,installation,sql-server-ce-4,C#,Windows,Visual Studio,Installation,Sql Server Ce 4,我正在创建一个现有Windows桌面应用程序的新版本,该应用程序已经运行了好几年。应用程序使用SqlServerCe数据库,该数据库安装在计算机的DataDirectory中。正在创建新版本的应用程序,以便与64位计算机兼容。我已经将代码迁移到在Macbook上运行Windows 10的Parallels虚拟机上,并且正在使用Visual Studio 2017构建新版本。构建工作正常(我正在使用安装向导项目创建安装文件)。但是,当我安装应用程序时,我在第一次尝试访问数据库时出错 错误是: 不允

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

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

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

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

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


在使用VisualStudio2010构建和在x86机器上部署时,这种方法工作得很好。提前感谢您提供的任何建议。

听起来可能是UAC

确保您正在运行exe(而不是msi),并且在安装程序项目的启动条件中已将Privilege设置为true


另外,右键单击并选择“以管理员身份运行”以确保运行应用程序。本质上,您的位置是错误的。Windows 7(及更高版本)的文件夹<代码>%SystemDrive%\ProgramData\MyCompany\MyApp默认为非管理员用户只读,应用于机器配置。我建议你读书

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

“文档”类型的文件,用户在中创建/打开/关闭/保存 跨用户使用的应用程序。这些通常是模板或 公共文件

示例:MyTemplate.dot

Windows 7:C:\Users\Public

Vista:%SystemDrive%\Users\Public

XP:%ALLUSERSPROFILE%\Documents

环境变量:

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

已知文件夹ID:FOLDERID\u PublicDocuments

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

CSIDL:CSIDL_通用_文档


为什么不直接使用%APPDATA%?

谢谢您的回复。我以管理员身份运行安装程序(使用Setup.exe,而不是.msi文件),但在运行应用程序时仍会出现错误。应用程序的一个要求是,一个普通的、非管理员的人应该能够运行它。直到现在,当我把数据库放在ProgramData目录的子目录中时,它才起作用(这不是目录的作用吗?)。但是,现在它不工作了,我也找不到任何方法让它再次工作。啊!澄清一下:如果我以管理员的身份运行应用程序,它就会工作。但是,正如我所说,应用程序的一个要求是它应该在正常权限下运行。非常感谢!这就是我要找的!我删除了代码中操纵ProgramData位置的任何内容,并删除了遗留部署项目,作为发布应用程序的一种方式。然后,我使用了项目的发布功能(在检查了所有设置之后),它成功了!非常感谢。我没有看到任何东西让我知道文件夹位置的变化,所以,我会为此挣扎很长一段时间。