连接字符串以访问 appdata 文件夹中的 sql localDB



我有一个带有SQL localDB的winform 应用程序,我用advanced installer来部署它,但是一旦部署在C:Programme files内的目标机器中,当我尝试更新数据库时出现错误时,我收到一个错误:Database read-only这是因为部署的文件夹没有授予用户在其中写入的权限。

因此,我将我的应用程序安装在我有权编写的userappdataroaming中,并且它起作用了!

这不好,我想将我的应用程序文件夹保留在C:Progamme files中,并在userappdataroaming中仅复制mydatabase.mdr。

但是如果我这样做,我将无法再使用我当前的connectionstring访问我的数据库,所以我的问题是如何更改我的connectionstring以访问任何目标机器内部userappdataroaming数据库?

这是我的连接字符串:

<connectionStrings>
<add name="GTC_Frater_Razes.Properties.Settings.db_alarmeConnectionString"
connectionString="Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=|DataDirectory|db_alarme.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

默认情况下,连接字符串不能使用|DataDirectory|这是一种扩展到完整路径的变量。如下所述:

DataDirectory~运算符开头的路径无法解析为DataDirectory~运算符分支之外的物理路径。

如果数据库将位于C:UsersUserNameAppDataRoamingApplicationNamedb_alarme.mdf,则可以手动设置连接字符串,如下所示:

<connectionStrings>
<add
name="GTC_Frater_Razes.Properties.Settings.db_alarmeConnectionString"
connectionString="Data Source=(LocalDB)MSSQLLocalDB;AttachDbFilename=C:UsersUserNameAppDataRoamingApplicationNamedb_alarme.mdf;Integrated Security=True"
providerName="System.Data.SqlClient" />
</connectionStrings>

由于显然你不能使用环境变量 -%APPDATA%- 你必须提前知道部署目录。

或者,可以在实际打开连接之前使用AppDomain.SetData方法设置DataDirectory的值:

AppDomain.CurrentDomain.SetData("DataDirectory", @"C:UsersUserNameAppDataRoamingApplicationName");

您可以获取AppDataRoaming的位置,如下所示;并将组合路径传递到SetData

var dataDirectory = Path.Combine(
Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), 
"ApplicationName"
);
AppDomain.CurrentDomain.SetData("DataDirectory", dataDirectory);

相关内容

  • 没有找到相关文章

最新更新