строка подключения к Access sql localDB в папке appdata - PullRequest
0 голосов
/ 08 мая 2018

У меня есть приложение winform с SQL localDB, и я использовал advanced installer для его развертывания, но после развертывания на моей целевой машине внутри C:Programme files я получаю сообщение об ошибке, когда пытаюсь обновить свою базу данных, которая говорит: Database read-only и это потому, что развернутая папка не дает пользователю права на запись в нее.

Итак, я установил свое приложение в \user\appdata\roaming, где у меня есть разрешение на запись, и это сработало!

это не хорошо, я хочу сохранить папку моего приложения в C:Progamme files и копировать только mydatabase.mdr в \user\appdata\roaming.

но если я это сделаю, я больше не смогу получить доступ к своей базе данных с моим текущим 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 голосов
/ 08 мая 2018

По умолчанию ваша строка подключения не может использовать |DataDirectory|, которая является своего рода переменной, которая раскрывается до полного пути. Как указано здесь :

Путь, начинающийся с оператора 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% - вам придется знать каталог развертывания заранее.

В качестве альтернативы, вы можете установить значение DataDirectory, используя AppDomain.SetData метод , прежде чем вы фактически откроете соединение:

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

Вы можете получить местоположение AppData\Roaming, как показано здесь ; и перейдите в комбинированном пути к SetData.

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