我正在非管理员Windows 7帐户上测试我的应用程序。该应用程序安装在程序文件中。这包括我需要读取的.sdf文件。我将连接字符串标记为只读,并设置我的文档的临时路径。这是我尝试connection.Open()
内部错误:无法打开共享 记忆区域
我已经在app.config中定义了连接字符串,但是在开始使用连接之前我正在修改它。这部分位于app.config Data Source=|DataDirectory|\DB.sdf;Password=password;
然后我像这样修改它:
connection = new SqlCeConnection(connectionString +
";Mode=Read Only; Temp Path=" + Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments));
这适用于我的开发人员计算机(显然),因为它从只读目录外部运行。但即使我手动将.sdf文件标记为只读它仍然有效,并在正确的文件夹中成功创建临时db文件。但是,在测试机器上,所有内容都位于只读程序文件文件夹中,并且不起作用。
此问题的主要目标是尝试确保我的程序不必以管理员身份运行,并且我希望不要从安装目录外部移动db文件的主副本。< / p>
如果我需要解释其他任何内容,请告诉我。感谢
答案 0 :(得分:2)
我也在使用sql ce数据库并遇到了同样的问题。我的解决方案是在 Environment.SpecialFolder.CommonApplicationData 的子文件夹中创建数据库。如果只有一个用户将使用它,您可以在 Environment.SpecialFolder.ApplicationData 中创建它。但在这里你不需要管理员权限。
另一点是app.config中的连接字符串。如果您在我的程序中修改它,它必须位于这样一个'非管理员权利'文件夹中。我在程序文件中的app-folder中有一个静态app.config,但是第二个在 Environment.SpecialFolder.LocalApplicationData 中有连接字符串(这是Win7中的'username \ AppData \ Local') 。并且我使用 DataProtectionConfigurationProvider 加密保护我的connectionstring,因此没有人可以读取数据库密码。
这是您可以将第二个app.config映射到您的应用的方式:
string ConfigPathString = @"{0}\MyApp\MyApp.config";
string ConfigPath = String.Format( ConfigPathString, System.Environment.GetFolderPath( Environment.SpecialFolder.LocalApplicationData ) );
ExeConfigurationFileMap fileMap = new ExeConfigurationFileMap();
fileMap.ExeConfigFilename = ConfigPath;
Configuration Config = ConfigurationManager.OpenMappedExeConfiguration( fileMap, ConfigurationUserLevel.None );
string myConnectionString = ConnectionStrings.ConnectionStrings["MyConnectionStringKey"].ConnectionString;
答案 1 :(得分:1)
就像卡尔加里在他的评论中已经提到的那样,由于Windows 7对非管理员的限制,你无法直接在程序文件夹中打开文件。但由于您不想在其中写入任何内容,为什么不在启动时将文件复制到Environment.SpecialFolder.ApplicationData
?
当您的程序启动时,只需将文件从程序文件夹中复制到适当的位置,根据需要使用它并在应用程序退出时将其删除。所以你不要留下任何碎片(除了应用程序会崩溃)。
为了确保最后一个场景,您可以在安装卸载例程中添加其他删除操作。因此,如果应用程序将被删除并在最后一次启动时崩溃,则安装程序将删除垃圾箱,使机器保持在安装软件之前。