appdata 文件夹中 Access sql localDB 的连接字符串
connectionstring to Access sql localDB in appdata folder
我有一个带有 SQL localDB
的 winform 应用程序,我使用 advanced installer
来部署它,但是一旦部署到 C:Programme files
内的目标机器中,我在尝试时遇到错误更新我的数据库说:Database read-only
那是因为部署的文件夹不允许用户在其中写入。
所以,我在 \user\appdata\roaming
中安装了我的应用程序,我有权写入并且它有效!
那不好,我想将我的应用程序文件夹保留在 C:Progamme files
中,并且只复制 mydatabase.mdr 到 \user\appdata\roaming
中。
但如果我这样做,我将无法再使用当前 connectionstring
访问我的数据库,所以我的问题是如何更改我的 connectionstring
以访问我在 [=16= 中的数据库] 在任何目标机器上?
这是我的连接字符串:
<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|
,这是一种扩展为完整路径的变量。如前所述 here:
A path that starts with the DataDirectory
or the ~
operator cannot resolve to a physical path outside the branch of the DataDirectory
and the ~
operator.
如果数据库位于 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);
我有一个带有 SQL localDB
的 winform 应用程序,我使用 advanced installer
来部署它,但是一旦部署到 C:Programme files
内的目标机器中,我在尝试时遇到错误更新我的数据库说:Database read-only
那是因为部署的文件夹不允许用户在其中写入。
所以,我在 \user\appdata\roaming
中安装了我的应用程序,我有权写入并且它有效!
那不好,我想将我的应用程序文件夹保留在 C:Progamme files
中,并且只复制 mydatabase.mdr 到 \user\appdata\roaming
中。
但如果我这样做,我将无法再使用当前 connectionstring
访问我的数据库,所以我的问题是如何更改我的 connectionstring
以访问我在 [=16= 中的数据库] 在任何目标机器上?
这是我的连接字符串:
<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|
,这是一种扩展为完整路径的变量。如前所述 here:
A path that starts with the
DataDirectory
or the~
operator cannot resolve to a physical path outside the branch of theDataDirectory
and the~
operator.
如果数据库位于 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);