Строка подключения SubSonic для SQLite
-
03-07-2019 - |
Вопрос
Я пишу настольное приложение, которому нужен простой уровень персистентности. Я узнал о SubSonic и его возможности работать с SQLite.Однако мне нужно сохранить файл базы данных в папке AppData пользователя, и я не знаю, как поместить такое значение в app.config — я не хочу использовать абсолютные пути.
Может ли app.config каким-либо образом получить доступ к переменным среды или ссылаться на папку данных приложения?
Решение
Невозможно указать папку AppData в файле app.config для строки подключения.
Но вы можете записать значение в файл конфигурации либо во время установки, либо при первом запуске приложения.
Другие советы
Для subsonic v2.x я бы проигнорировал строку подключения app.config и просто установил ее во время выполнения перед работой с базой данных.Имя провайдера, конечно, останется прежним.
string dbPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData), @"MyApplication\Northwind.db3");
DataService.Providers["Northwind"].DefaultConnectionString =
String.Format(@"Data Source={0};Version=3;New=False;Connection Timeout=3", dbPath);
«Структурный способ» поиска данных приложения — использовать Environment.GetFolderPath(Environment.SpecialFolder.ApplicationData).
Это позволит найти правильный путь к данным приложения независимо от платформы.
Если вы используете ASP.NET, на любом языке есть несколько способов.
Server.MapPath("~") вернет корень приложения в виде полного пути, после чего вы можете просто добавить к нему "/app_data", чтобы получить полный путь.
В качестве альтернативы проверьте httpcontext.current.request и httpcontext.current.application Существует множество (и гораздо лучше, чем то, что я только что упомянул), которые обеспечат вам одну и ту же папку - корень приложения, как и полный путь.
Обратите внимание, что все это должно работать, даже если у вас есть приложение в виде виртуальной папки и обычная папка с приложением, настроенным в IIS для этой папки.
Однако это возможно только во время выполнения, поэтому об этом нельзя упоминать в app.config.вы можете попробовать использовать относительные пути, из которых app.config является резидентным IE "../App_Data" или "/App_data", но я не уверен, что вы соответствуете точным требованиям.
Удачи