2017-10-11 31 views
3

我正在创建一个已运行良好多年的现有Windows桌面应用程序的新版本。该应用程序使用SqlServerCe数据库,该数据库安装在机器的DataDirectory中。正在创建新版本的应用程序以与64位机器兼容。我已将代码迁移到在Macbook上运行Windows 10的Parallels VM,并使用Visual Studio 2017构建新版本。构建工作正常(我正在使用安装向导项目创建安装文件)。但是,当我安装应用程序时,第一次访问数据库时出现错误。为64位Windows机器创建构建时出现“访问数据库文件不被允许”错误

错误提示: 不允许访问数据库文件。 [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> 

该建筑使用Visual Studio 2010和x86机器上进行部署时工作得很好。提前感谢您提供的任何建议。

回答

0

本质上 - 您的位置错误。针对Windows 7(及更高版本)的文件夹%SystemDrive%\ProgramData\MyCompany\MyApp默认为只读,用于非管理员用户,应该用于机器配置。我建议你阅读

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。点

的Windows 7:C:\用户\公用

Vista的:的%SystemDrive%\用户\公共

XP:%ALLUSERSPROFILE%\文件

环境变量:

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

已知的文件夹ID:FOLDERID_PublicDocuments

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

CSIDL:CSIDL_COMMON_DOCUMENTS

+0

非常感谢!这就是我一直在寻找的!我删除了处理ProgramData位置的代码中的任何内容,并删除了旧版的Deployment项目作为发布应用程序的方式。然后,我使用项目的发布功能(在检查完所有设置后),并且它工作正常!非常感谢。我没有看到任何让我知道文件夹位置发生变化的事情,所以我很久以来就一直在努力。 – rogdawg

2

听起来像它可能是UAC

确保您正在运行的exe文件(不是MSI),并且你在LaunchConditions特权设置为True,您的安装项目

另外,还要确保你右键单击并选择“以管理员身份运行”运行应用程序

+0

感谢您的回复。我运行安装程序作为管理员(使用Setup.exe,而不是.msi文件),但是,当我运行应用程序时仍然出现错误。应用程序的一个要求是,一个普通的,非管理员的人应该能够运行它。到目前为止,当我将数据库放入ProgramData目录的子目录时(这不是目录的目录?),它工作正常。但是,现在它不起作用,我找不到任何方法让它再次工作。啊! – rogdawg

+0

澄清:如果我以管理员身份运行该应用程序,它将起作用。但是,正如我所说的,应用程序的一个要求是它应该以正常的权限运行。 – rogdawg

0

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

相关问题