在测试计算机上打开与 SQL CE 文件的连接时出错

本文关键字:文件 CE 连接 出错 SQL 计算机 测试 | 更新日期: 2023-09-27 17:56:59

我正在非管理员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文件标记为只读,它仍然可以工作,并在正确的文件夹中成功创建临时数据库文件。但是,在测试计算机上,所有内容都位于只读程序文件文件夹中,并且不起作用。

此问题的主要目标是尝试确保我的程序不必以管理员身份运行,并且我希望避免从安装目录外部移动数据库文件的主副本。

如果我需要解释其他任何事情,请告诉我。谢谢

在测试计算机上打开与 SQL CE 文件的连接时出错

我也在使用sql ce数据库,并且遇到了同样的问题。 我的解决方案是在Environment.SpecialFolder.CommonApplicationData的子文件夹中创建数据库。如果只有一个用户使用它,则可以在Environment.SpecialFolder.ApplicationData中创建它。但在这里您不需要管理员权限。

另一点是 app.config 中的连接字符串。如果您像我一样在程序中修改它,它也必须位于这样一个"非管理员权限需要"文件夹中。我在程序文件中的应用文件夹中有一个静态 app.config,但第二个在 Environment.SpecialFolder.LocalApplicationData 中带有连接字符串(这是 Win7 中的"用户名''AppData''Local")。我使用 DataProtectionConfigurationProvider 加密保护我的连接字符串,因此没有人可以读取数据库密码。

以下是将第二个 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;

就像卡尔加里在他的评论中已经提到的那样,由于Windows 7对非管理员的限制,您无法真正直接在程序文件夹中打开文件。但是由于您不想在其中写入任何内容,为什么不在启动时简单地将文件复制到Environment.SpecialFolder.ApplicationData中呢?

当您的程序启动时,只需将文件从程序文件夹中复制到适当的位置,根据需要使用它并在应用程序退出时将其删除。因此,您不会留下任何碎片(除非应用程序会崩溃)。

只是为了确保最后一种情况,您可以向安装程序卸载例程添加额外的删除操作。因此,如果应用程序将被删除并且在上次启动时崩溃,安装程序将删除垃圾,使机器像安装软件之前一样。