Меню

В каком файле хранятся настройки odbc

Управление источниками данных ODBC

Open Database Connectivity (ODBC) — это протокол, используемый для подключения базы данных Microsoft Access к внешнему источнику данных, например Microsoft SQL Server. В этой статье содержатся общие сведения об источниках данных ODBC, способах их создания и подключения к ним с помощью Microsoft Access. Действия, которые требуется выполнить, зависят от используемых баз данных и драйверов ODBC.

В этой статье

Сведения об источниках данных ODBC

Источник данных — это источник, который содержит данные и сведения о подключении, необходимые для доступа к этим данным. Источником данных может быть сервер SQL Server, реляционная СУБД Oracle, электронная таблица или текстовый файл. Сведения о подключении могут включать расположение сервера, имя базы данных, идентификатор входа, пароль и различные параметры драйвера ODBC, описывающие способ подключения к источнику данных. Эти сведения можно получить у администратора базы данных, к которой нужно подключиться.

В архитектуре ODBC приложения (такие как Access) подключаются к диспетчеру драйверов ODBC, который, в свою очередь, использует конкретный драйвер ODBC (например, Microsoft SQL ODBC) для подключения к источнику данных. В Access источники данных ODBC используются для подключения к внешним источникам данных, у которых нет встроенных драйверов.

Чтобы подключиться к такому источнику данных, выполните указанные ниже действия.

Установите соответствующий драйвер ODBC на компьютере с источником данных.

Определите имя источника данных (DSN) с помощью программы Администратор источников данных ODBC, чтобы сохранить сведения о подключении в реестре Microsoft Windows или DSN-файле, либо с помощью строки подключения в коде Visual Basic, чтобы передать сведения о подключении непосредственно диспетчеру драйверов ODBC.

Машинные источники данных

Машинные источники данных хранят сведения о подключении в реестре Windows на определенном компьютере. Такие источники данных можно использовать только на компьютере, на котором они определены. Есть два типа машинных источников данных: пользовательские и системные. Пользовательские источники данных доступны и отображаются только для текущего пользователя. Системные источники данных могут использовать все пользователи компьютера. Они отображаются для всех этих пользователей и системных служб. Машинные источники данных особенно полезны, когда требуется обеспечить дополнительную защиту, поскольку машинный источник данных могут просматривать только вошедшие в систему пользователи. Кроме того, такой источник нельзя удаленно скопировать на другой компьютер.

Файловые источники данных

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

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

Строки подключения

В модуле можно определить форматированную строку со сведениями о подключении. Строка подключения передает сведения о подключении непосредственно диспетчеру драйверов ODBC. Это помогает упростить приложение, устраняя необходимость создания DSN администратором или пользователем перед использованием базы данных.

Дополнительные сведения об интерфейсе ODBC см. в разделе MSDN Справочник программиста по ODBC.

Добавление источника данных ODBC

Прежде чем продолжить, установите подходящий драйвер ODBC для источника данных, к которому нужно подключиться.

Примечание: Для добавления или настройки источника данных ODBC необходимо входить в группу администраторов локального компьютера.

Нажмите кнопку Пуск и выберите пункт Панель управления.

На панели управления дважды щелкните элемент Администрирование.

В диалоговом окне «Администрирование» дважды щелкните элемент Источники данных (ODBC).

Откроется диалоговое окно Администратор источников данных ODBC.

Откройте вкладку Пользовательский DSN, Системный DSN или Файловый DSN в зависимости от типа источника данных, который нужно добавить. Дополнительные сведения см. в разделе Сведения об источниках данных ODBC.

Нажмите кнопку Добавить.

Выберите драйвер, который нужно использовать, и нажмите кнопку Готово или Далее.

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

Следуйте указаниям и введите требуемые сведения о подключении в последующих диалоговых окнах.

Для получения дополнительных сведений об отдельных параметрах нажмите кнопку Справка в диалоговом окне ODBC.

Источник

Использование ODBC в Visual C++

ОГЛАВЛЕНИЕ

Установка соединения

Для работы необходимо включить описание функций, которые находятся в файле afxdb.h:

У данного класса есть всего один член данных. Это m_hdbc. Он указывает на текущее соединение ODBC. Имеет смысл только если оно установленно. Эта переменная имеет тип HDBC

Для установки соединения Вам необходимо вызвать функцию Open. Вот её описание.

Как видите все параметры кроме первого не устанавливать. Первый параметр lpszDSN указывает на имя DNS для связи с источником данных. Эти имена находятся в настройке ODBC в панели управления на вкладке File DNS. Это имя можно установить в NULL, и тогда при выполнении программы Вам предложат выбрать источник. Данная ситуация изображена на рисунке ниже:

Если вы укажите имя и оно будет ошибочно, то получите сообщение о ошибке, как на рисунке ниже:

Для контроля над данной ситуацией необходимо воспользоваться обработкой прерываний VC++. В примере ниже перехватываются все прерывания возможные при открытии источника данных. В ответ на ошибку появится диалоговое окно.

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

По завершению работы источник данных необходимо закрыть используя функцию Close.

Читайте также:  Включена настройка не отображать в каналах чата л2

Если вы хотите попробовать, то создайте с помощью AppWizard приложение диалоговое окно с одной кнокой и к этой кнопке привяжите событие нажатия. Я так и делал, когда писал пример.

Продолжаем устанавливать соединение

Для работы с данным примером нам необходимо установить связь ODBC драйвера с файлом. Это очень удобно. Если у Вас есть файл на сетевом диске, то при изменении его местоположения необходиом только изменить путь в ODBC и программе. Так же и при установке нового рабочего место настраиваете доступ и программа работает.

Настройка связи драйвера с файлом происходит на вкладке File DNS. Здесь нам нужно выбрать пункт меню Configure.

Если файл выбран, то Вы увидите запись в разделе Database, если нет, выберите пунк Select и выберите файл. Дальнейшее описание подразумевает, что файл выбран.

Ниже процедура открытия с новым параметром и обработкой ошибок.

Внимание В реализацию этих функций встроены макросы ASSERT, и поэтому для проверки работоспособности данного кода надо пользоваться типом реализации Release иначе вы просто получите сообщение о прерывании программы.

Соберите и запустите программу. Нажмите кнопку. Все нормально. Выйдите из программы. Запустите ACCESS откройте таблицу и опять запустите программу, жмите кнопку. Вот теперь, так как таблица открыта, Вы и получите сообщение, как на рисунке выше. Эксклюзивный доступ подразумевает, что только один пользуется таблицей.

Результат работы функции возвращается в виде иключения, у исключения конктерный тип класса. Вот его мы и отлавливаем. А у этого класса есть член данных m_strError, который отвественнен за строку с ошибкой.

Открывать базу данных можно и так.

Добавленный параметр говорит о том, что база данных будет открыта только для чтения. Это тоже полезно. Например бухгалтер по складам не имеет право никак править должности людей, но он должен иметь доступ к данным. Соотвественно открывать он должен эти таблицы только для чтения. Этот режим говорит о том, что изменения в базу вноситься не будут. Если вы его явно не указали, то открыто с разрешением для правки.

На базе данных может стоять пароль. Вот так это делается в ACCESS.

Соотвественно когда если пароль установлен, и Вы запустите программу, то у Вас появится окно с именем пользователя и просьбой ввести пароль. Для автоматического ввода пароля используется следующий параметр.

Последний параметр это текстовая строка с набором данных разделенных точной с запятой.

Этот набор может меняться от одной базы данных к другой. Например при связи с MS SQL есть дополнительные параметры, как HOST.

И последний возможный параметр:

Этот параметр указывает надо загружать или нет библиотеку курсоров. Библиотека кусоров улучшает функциональность ODBC, но нужна она не всегда.

Информация о соединении

Сразу после установки соединения есть возможность проверить его работоспособность, и получить ряд параметров соединения.

Вероятно в первую очередь вы заинтересуетесь правильностью открытия и установки соединения. Эта возможность реализована в функции IsOpen. Эта функция возвращает значение отличное от нуля, если связь установлена.

При установки связи в прошлый раз мы с Вами передавали строку соединения, но использовали часть параметров. Функция GetConnect() возвращает строку CString, в которой перечислены все параметры используемые при установке соединения.

У меня появляется вот такая строка. Чать параметров в строке соединения я не упоминал, а они присутсвуют так как заданы по умолчанию. И если Вы хотите посмотреть парамтры соединения с конкретным сервером, то используйте этот код для получения информации.

Теперь получим имя базы данных, с которой мы установили соединение.

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

И проверим возможность использования транзакций используя функцию CanTransact(). Не все драйвера ODBC имеют данную возможность.

CRecordset

Итак для создания обьекта нам необходимо обьявить переменную. Обьект создается на основе конструктора. Вот описание конструктора.

Как видите в конструктор можно передать указатель на объект типа CDatabase, который отвечает за доступ к базе данных. Конструктор предусматривает и простое создание без передачи обьекта CDatabase. Действительно манипулируя доступными дланными есть возможность в последствии прикрепить класс CDatebase.

Работа с классом CDatabase расматривалась в предыдущих главах. Будем cчитать, что мы создали и открыли этот обьект.

Или вот так например:

В плане использования два предыдущих конструктора идентичны, и в плане функциональности тоже. Переменная m_pDatabase, в которой хранится указатель на базу данных в виде указателя на класс CDatabase, общедоступная и может быть использована в любой момент. Вот её объявление:

Имея созданный объект CRecordset Вы можете теперь открыть таблицу на основе SQL запроса.

Подразумевается, что в Вашей базе данных присутствует таблица Table1. Вызов данной функции может вызвать исключительные ситуации следующих типов:

Расшифровка этих исключительных ситуаций позволит Вам получить информацию о произошедшей ошибке. Только не забудьте при подобных испытаниях с исключительными ситуациями переключаться на тип проекта Release, дабы не нарываться на злобный ASSERT. Смотрите пример ниже. Таблицы TABLE21 у меня нет.

Класс CRecordset имеет функцию IsOpen она вам знакома из класса CDatabase:

Знакомство с SQL

Для построения объекта CRecordset необходим параметр в виде SQL запроса к БД.

Важной особенностью SQL является то, что этот язык описывает только результат, процесс получения на нем описать нельзя. То есть я могу сказать выбери мне данные, но механизм не пишу. Кроме того следует отметить разницу программирования на основе SQL от программирования на других языках. При получении результатов нет необходимости пробегать по всем полям. Запрос работает сразу со всей базой данных. Это очень серьезное отличие от языка скажем FoxPro.

Читайте также:  Tp link 8961nd настройка wan

В прошлом шаге мы использовали оператор SQL для создания обьекта CRecordset.

Мы использовали оператор Select. Этот оператор позволяет получить данные. Ниже приведена расшифровка.

Данный оператор выберет всю таблицу. Но мы с Вами можем этим оператором ограничить диапазон выбора. Например:

Выбирает только столбец Family в таблице TABLE1.

Если необходимо выбрать несколько столбцов, то они должны быть разделены запятой:

Два столбца Family и ID.

Используя WHERE и логические операции AND,OR можно составить довольно сложное условие.

Также можно указать, что производить выбор из двух или более таблиц перечислив их после FROM через запятую

Пришло время выводов. Для создания обьекта CRecordse на основе запроса SQL только те данные, с которыми вы будете работать. Тем самым перенеся тяжесть обработки данных на сервер и съэкономив системные ресурсы на клиенте.

Описание оператора SELECT далеко не полное 🙂

Продолжаем открывать Recordset

Вот полное описание функции Open:

Как видите при открытии набора записей есть несколько типов:

Смотрим как это сделать:

Для связи с базой данных мы применили новую функцию OpenEx. Она сразу открывает и инициализирует связь с базой данных и рекомендована к использованию. В ней я указал драйвер в формате DNS=name.

И выделенное жирным открытие набора строк. Этот набор строк можно проверить открытием небезызвестной IsOpеn. Этот код защищен от ошибок.

То есть Вы спокойно взяв этот код за основу можете создать строку ввода SQL и дать пользователю сформировать запрос, который Вы отобразите. Если он ошибется, ничего страшного не будет.

Как видите, в указание драйвера я поставил NULL.

Изучаем CRecordset

Итак, мы можем получить обьект CRecordset, например, как ниже. Теперь пора изучить его свойства. Открытие сильно упрощено.

Нам может понадобиться SQL, на основе которого создан данный источник строк:

Теперь надо проанализировать сколько столбцов нам вернулось. Вы можете сказать: «ведь мы знаем, что два из запроса SQL», но запрос можно построить и так, что это будет не факт. Смотрите SELECT. Получаем количество столбцов:

Используя количество столбцов можно получить о них информацию с помощью GetODBCFieldInfo():

Информация о типе полей находится в струтуре CODBCFieldInfo():

Мы воспользовались данными из структуры m_strName. В этом поле структуры находится имя столбца запроса.

Второе поле m_nSQLType говорит нам о типе данных в данной колонке. Вот описание типов. Вы, наверно, заметили, что я перечислил не все возможные типы, например, нет OLE.

Пример ниже показывает как этим можно воспользоваться. Он просматривает все колонки в поисках поля типа Integer и при нахождении выдает о нем информацию:

Поле структуры m_nPrecision соотвествует в ACCESS ширине поля.

Поле Scale говорит о том, сколько знаков после запятой у числового поля, а m_nNullability отвечает за то, может ли это поле принимать NULL. И для этого данное поле необходимо сравнить с SQL_NULLABLE или с SQL_NO_NULLS.

Записи в CRecordset

Итак, с информацией о столбцах мы разобрались. Теперь неплохо бы получить само содержание столбца и текущей строки, а лучше всего вместе. Для реализации этой функции есть переменная типа GetFieldValue, в которую передается два параметра. Номер столбца и переменная типа CDBVariant для помещения значений. Вот код, который пробегает по строкам первого столбца и показывает содержимое:

Переменная типа CDBVariant принимает значение поля и может принять любое значение. Описание этой переменной. Только это класс, а не переменная 🙂

Конструктор этого класса не имеет параметров, и поэтому в коде я так спокойно объявил объект класса. Команда Move перемещает указатель на заданную позицию. Я ставлю и перемещаю в первую позицию. После этого задаю цикл, проверяя с помощью IsEOF достижение конца выборки (источника строк).

Функция GetFieldValue данные из указанного столбца в переменную. Эта функция перегруженная и может иметь несколько возможных параметров. Я применил этот вариант.

Зная, что в этом столбце находится строка, я взял соотвествующий ей указатель m_pstring. Проверить это можно запустив в режиме отладки до строки AfxMessageBox.

То есть, если Вы даже не предпологаете тип данных, применив данный прием, вы можете попробовать извлечь выводы о типе данных, а самое главное реально прочитанное из данного столбца. Наверно не надо быть Ностардамусом, чтобы догадаться, что если столбец будет иметь тип Date, то и указатель нужен соотвествующий.

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

При использовании обьекта CRecordset возникает необходимость подсчитать сумму в поле. Возникает желание пробежаться по всем полям с помощью MoveNext и произвести подсчет. Это можно. На всякий случай задумайтесь о другом варианте. В примере ниже я подсчитаю сумму на основе оператора SQL SELECT:

Фильтры, сортировка CRecordset

Если тщательно разобраться с SQL оператором SELECT, то с помощью него можно получить практически любые виды от исходной таблицы. Но этот способ не единственный. Даже если с помощью данного оператора Вы отсортировали записи, всегда возникает необходимость допустим их отсортировать по полю или наложить фильтр. Это можно сделать и на основе доступных переменных класса CRecordset.

Для накладывания фильтра в классе CRecordset есть переменная m_strFilter. В эту переменную можно поместить фильтр и вызвать функцию обновления источника строк.

Обратите внимание, что я обьявил таблицу как dynaset, что позволяет проводить подобные операции, в будущем эта опция разрешит добавлять, редактировать и удалять записи.

В фильтр я поместил строку, которая указывает, что поле должно быть меньше 100. Если вы запустите, то увидите фамилию Vasilev, так как он единственный, который имеет это поле меньше 100. После задания фильтра я вызвал функцию Requery, которая обновила источник строк на основе фильтра. Не забывайте её использовать.

Читайте также:  Как открыть настройки роутера нетгир

При работе этого кода первым будет Artem, хотя в исходной таблице он последний :-(. Логика точно такая же, как и выше в примере. Установка поля сортировки и обновление.

Понимание RFX

Как видите ничего необычного нет. Простое наследование, перегрузка конструктора, обьявление функции DoFieldExchange для организации механизма обмена и переменной типа CString для соответствия формату поля колонки из таблицы базы данных. Я не сделал эту переменную private, но Вы можете это делать спокойно.

Реализация конструктора. Просто и ясно :-).

В простом приближении правило простое. Перед функциями обмена надо вызвать SetFieldType.

Опять сильно упрошено. Эта функция позволяет Вам произвести обмен между переменной типа CString и текущей строкой в конкретной колонке базы данных. У меня колонка называется Famili. Обратите внимание на то, что строка помещена в конструкцию _T(. ), это сделано для гарантии создания объекта типа CString. А вот ниже полное описание этой функции.

После создания данного класса мы можем воспользоваться им, например, для добавления новой записи в Базу данных.

Как Колю сделать Васей?

Добалять записи мы научились. Но как оказывается, кто бы мог подумать, их необходимо еще и редактировать. Это являение вызвано несовершенством нашего мира. Например жена может поменяться 🙂

Функцией Edit мы разрешаем начать редактировать запись. Эта функция вызовет механизм RFX дабы уведомить о том, что мы будет редактировать. Это нормально. И хорошо, а не так как некоторые начальники, правят еще не прочитав. Соответственно мы можем увидеть, что изменим. Для этого и используется функция AfxMessageBox.

Теперь мы присваиваем новое значение переменной и вызываем Update, дабы закрепить изменение.

Получилось. Вот только если Вы Васю теперь захотите сделать Катей это уже не нормально. Но у кого какой вкус :-)) По мне лучше удалить, чем мы с Вами и займемся.

Просто до ужаса. Открываем CRecordset, переходим на запись, удаляем, закрываем. Что здесь можно написать еще?

Общий обзор ODBC

ODBC реализует интерфейс доступа к разным SQL совместимым базам данных.

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

API функции одинаковые и не зависят от поставщика

SQL операторы могут быть сгенерированы на любой стадии при компиляции или выполнении.

Данные принимаются в программу в едином формате.

Существует три типа имен DNS:

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

Драйвера могут поддерживать три уровня грамматики SQL минимальная грамматика поддерживается всеми драйверами:

Где хранятся настройки об источнике данных ODBC?

В предыдущих шагах «Установка соединения» и «Продолжаем устанавливать соединение» мы с Вами пользовались утилитой Администратор ODBC для настройки соединения. Мы его находили в панели управления. На самом деле это обычная программа Odbcad32.exe, которая находится по определенному пути. Тo есть ее можно напрямую запускать из программы и требовать, чтобы пользователь установил данные. Но есть и другой выход. Данные о на строке источников ODBC хранятся в реестре в разделе SOFTWARE/ODBC.

Вот эти данные. Мы теперь можем при желании вручную их править или программным путем, прося пользователя только указать файл. Итак, путь такой:

Итак мы может настраивать ODBC следующими методами:

Функция SQLConfigDataSource()

Эта функция имеет следующий вид:

Функция ворачивает TRUE, если выполнена удачно и FALSE если не удачно. Атрибут описывает тип команды и может быть следующим:

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

Пишем в таблицы Excel

Только есть одна хитрость, версию драйвера нужно использовать Excel 4.0. В Excel 4.0 отдельная таблица является отдельным файлом, что и позволяет так просто создать таблицу. Ну, а откроют ее все. Ведь вам нужно просто вывести данные.

Если мы хотим автоматически настроить соединение ODBC при установке программного обеспечения, то нам нужно изменить немного код прошлого шага для установки текущего каталога и версии.

Выполнение функций ODBC API из класса CDatabase

Несмотря на то, что классы MFC и облегчают работу с ODBC все равно они не описывают всех возможностей ODBC API. Вам в любой момент может понадобиться вызвать функции ODBC API. К счастью в MFC это предусмотрено. В классе CDatabase предусмотрен соответствующий указатель на соединение, воспользовавшись которым Вы имеете возможность вызвать функцию ODBC API напрямую.

Поддержка транзакций

Класс CDatabase поддерживает использование транзакций.

Драйвер ODBC может использовать транзакции. Это легко проверить. Функция:

Позволяет Вам проверить поддерживает ли драйвер транзакции. Вам вернется , если да. Если транзакции поддерживаются, то перед операциями нам нужно вызвать функцию:

Запускает механизм транзакций. Если мы так запустили операции, то мы должны либо подтвердить внесенные изменения:

Все операции по управлению транзакциями основываются на объекте СRecordset, который использует это соединение.

Настройка ODBC и текущий каталог

Настройка драйвера ODBC требует каталог, где будут хранится файлы. Естественно, что каталог может и не присутствовать на компьютере. Наиболее надежно использовать тот каталог откуда запущена программа. Ниже предлагается один из способов. Здесь получается текущий каталог и собирается на основе него строка конфигурации. Все параметры перечисляются через точку с запятой. Как ни странно, но это работает. Зато не нужно замены конечных символов параметров на \0\0.

Источник