Устранить жесткое кодирование строки подключения

Я сделал графический интерфейс, который может выполнять обычные операции с базой данных (загружать существующие данные, изменять их или добавлять новые записи). GUI сделан в C++ используя сырье WinAPI,

Проблема в строке подключения. Он жестко запрограммирован, поэтому он заставляет пользователя хранить базу данных в той же папке, где находится GUI. Ниже приведен пример в C++, с помощью ADO:

static wchar_t *bstrConnect= L"Provider=Microsoft.ACE.OLEDB.12.0;\
Data Source = .\\MyDatabase.accdb";

Я хочу предоставить пользователю свободу выбора, когда речь заходит о том, где будет расположена база данных, но я не знаю, как изменить строку приложения / соединения для этого.

Я попытался найти здесь примеры, и искал в Интернете, но безуспешно. Возможно, я начинающий и самоучка как-то связан с этим.

ВОПРОС:

Есть ли пример / учебник / документация, которая может показать мне правильный принцип для обработки этого типа «сценария»?

1

Решение

Вам, вероятно, нужно заменить .\\MyDatabase.accdb часть вашей строки подключения с полным путем к этому файлу базы данных. В настоящее время это относительный путь.

Другими словами, вам нужно построить строку соединения во время выполнения, используя доступные функции форматирования / объединения строк.

1

Другие решения

То, что я хотел бы сделать, это как ранее предложено wallyk, сохраните его в каком-либо файле конфигурации, а затем прочитайте при необходимости.

Например, самым простым способом может быть стандартный файл .INI, который содержит следующее:

[Database]
File=".\MyDatabase.accdb"

Этот тип файлов может быть тривиально использован с функциями WinApi WritePrivateProfileString а также GetPrivateProfileString.

Конечно, это может быть файл любого типа, настолько простой или сложный, насколько вам нужно. Или вы можете даже сохранить эти биты данных в реестре, если вы действительно этого хотите. Другой вопрос — где его сохранить, и это может быть еще одно целое обсуждение (многие вопросы здесь уже решаются по этому вопросу). Короче говоря, идея заключается в том, чтобы хранить его где-то, что может быть прочитано во время выполнения вместо жесткого кодирования.

С точки зрения кода это означает, что в любом месте, когда программе требуется строка подключения, вместо чтения жестко закодированной константы вы вызовете функцию, которая ее возвратит. Функция, в свою очередь, создаст ее (инкапсулируя всю логику, чтобы получить ее из файла конфигурации), выполнив что-то вроде этого:

  1. Прочитайте файл конфигурации, используя GetPrivateProfileString (или соответствующие функции / библиотеки, если используете что-то другое).
  2. В случае неудачи система может использовать файл по умолчанию или просто выдать ошибку и сообщить об этом пользователю.
  3. Объединить это с жестко закодированным поставщик параметр, или выберите его из списка возможных вариантов (я бы жестко закодировал, так как вы часто будете использовать фиксированный механизм БД, и разные механизмы нуждаются в разных параметрах подключения, и сохранение всей строки в файле не требуется, если вы знаете, как его построить. на мой взгляд, так что давайте не будем раскрывать еще одну возможную точку отказа).
  4. Создайте последнюю строку из обоих фрагментов данных. Здесь также могут быть включены дополнительные параметры, либо считанные из конфигурации, либо жестко закодированные, либо полученные как функциональные параметры, в зависимости от ситуации.
1

Ваше приложение не должно использовать жесткое кодирование. Разработайте стратегию конфигурации и реализуйте ее.

Например, найдите его в домашнем каталоге текущего пользователя, подкаталоге конфигурации пользователя, каталоге конфигурации группы пользователя, каталоге конфигурации системы и / или отобразите список конфигураций по умолчанию.

0