connectionstring访问appdata文件夹

时间:2018-05-08 09:39:16

标签: connection-string localdb setup-deployment

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

所以,我在\user\appdata\roaming安装了我的应用程序,在那里我有权写,并且它有效!

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

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

这是我的连接字符串:

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

1 个答案:

答案 0 :(得分:0)

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

  

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

如果数据库位于C:\Users\UserName\AppData\Roaming\ApplicationName\db_alarme.mdf,您可以按如下方式手动设置连接字符串:

<connectionStrings>
  <add
    name="GTC_Frater_Razes.Properties.Settings.db_alarmeConnectionString"
    connectionString="Data Source=(LocalDB)\MSSQLLocalDB;AttachDbFilename=C:\Users\UserName\AppData\Roaming\ApplicationName\db_alarme.mdf;Integrated Security=True"
    providerName="System.Data.SqlClient" />
</connectionStrings>

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

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

AppDomain.CurrentDomain.SetData("DataDirectory", @"C:\Users\UserName\AppData\Roaming\ApplicationName");

您可以获得AppData\Roaming所示位置here;并将组合路径传递给SetData

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