Необходимо установить источник данных odbc. Определение внешних источников данных в ODBC. Создание приложения, использующего БД

Создание приложения, использующего БД

Аннотация к подразделу

Смысл подраздела – обеспечение выполнения лабораторной работы по созданию приложения БД ·

Для работы с базами данных часто используют псевдонимы (alias). Псевдоним БД - это имя некоторой базы данных, которое прописывается в настойках таким образом, что для обращения к таблицам данной базы достаточно указать alias. Это удобство позволяет легко менять тип БД, не меняя текста программ.

Рассмотрим принцип определения псевдонима БД Microsoft Access, хранящейся в файле на жеском диске. Предположим, мы хотим, чтобы псевдоним borey соответствовал БД в файле borey.mdb. Программно мы можем это сделать, используя функцию SQLConfigDataSource ODBC API.

Для того чтобы задать псевдоним в ручном режиме необходимо запустить Администратор источников данных ODBC (Пуск \ Настройка \ Панель управления \ Администрирование \ Источники данных (ODBC)). Окно администратора показано на рисунке 6.

Рисунок 6 – Администратор источников данных ODBC

Далее на вкладке «Пользовательский DSN» или «Системный DSN» (в зависимости от того, создается ли источник данных для текущего пользователя или для всех пользователей системы соответственно) нажать кнопку «Добавить». ·

Отобразится список установленных драйверов и их описание (рисунок 7).

Рисунок 7 – Администратор источников данных ODBC. Диалог создания нового источника данных

·После нажатия на кнопку "Готово" в открывшемся окне (рисунок 8) необходимо указать имя источника "db" и путь к файлу.

Рисунок 8 – Администратор источников данных ODBC. Диалог создания нового источника данных

·Нажатием кнопки "Ок" в системе появится псевдоним «borey» к БД, который можно будет использовать при обращении к файлу borey.mdb (рисунок 9). Следует заметить, что аналогичным образом можно указать псевдоним и к другим СУБД.

Рисунок 9 – Администратор источников данных ODBC. Диалог создания нового источника данных

2.2 Базовые сведения о языке C++ (wikipedia)

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

Поддерживает следующие парадигмы программирования:

Процедурное программирование,

Объектно-ориентированное программирование,

Обобщённое программирование.

Обеспечивает:

Модульность,

Раздельную компиляцию,

Обработку исключений,

Абстракцию данных,

Объявление типов (классов) объектов,

Встраиваемые функции,

Виртуальные функции. ·

Стандартная библиотека включает, в том числе, общеупотребительные контейнеры и алгоритмы. C++ сочетает свойства как высокоуровневых, так и низкоуровневых языков. В сравнении с его предшественником – языком C, – наибольшее внимание уделено поддержке объектно-ориентированного и обобщённого программирования. Синтаксис C++ унаследован от языка C.



Последний стандарт языка C++, который получил название «C++11» принят в 2011 г. В него были включены существенные дополнения в ядро языка и расширение стандартной библиотеки. ·

Тема нашего сегодняшнего разговора - ODBC. Если вы хоть раз писали СУБД (системы управления базами данных), то вам, наверное, знакома эта аббревиатура. Расшифровывается ODBC как Open DataBase Connectivity (вольный перевод - открытая система связи с базами данных). Open (открытая) в данном случае означает "расширяемая", "легко наращиваемая", "открытая для модификаций". Вы сами это поймете, если посмотрите на архитектуру построения ODBC:

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

Физически ODBC представляет собой набор динамических библиотек DLL, которые обслуживают подключение и работу с конкретным типом базы данных.При запросе на подключение к определенной, заранее описанной базе "активизируется" определенная DLL - драйвер этого типа БД. Обращение к определенной базе данных происходит по имени так называемого источника данных ODBC (или DSN - data source name). Можно представить DSN как своего рода объявление БД на данном компьютере, причем DSN может быть пользовательским, т.е. находится в области видимости только одного польователя, в сеансе которого был создан этот DSN, и системным, т.е. видимым всеми пользователями данного компьютера.

Управление источниками данных ODBC (да и вообще настройкой всей системы ODBC) осуществляется с помощью специальной программы - ODBC-администратора. Давайте разберем, где его можно найти в различных версиях Windows:

Windows 9х - сам исполняемый файл odbcad32.exe лежит в каталоге Windows\System. Запускать его можно напрямую либо через Панель управления (значок "Источники данных ODBC (32-бит)"). Если на компьютере установлен BDE, запустите администратор BDE и из меню Object выберите пункт ODBC Administrator.

Windows 2000 - исполняемый файл odbcad32.exe лежит в каталоге WinNT\System32, а запускать его можно через Панель управления -> Администрирование -> Источники данных ODBC. К сожалению, у меня нет возможности проверить, как с ODBC в NT3.51 / 4 - не думаю, что там ребята из Microsoft сильно его спрятали.

Почему ODBC?

Ведь есть же BDE, скажете вы. Да, возможно вы правы. Однако здесь есть "но". У обоих движков есть свои преимущества и недостатки. ODBC намного лучше работает с "родными, от Microsoft" источниками данных продуктов Microsoft Office - типа Access, Excel, MS SQL Server (вообще-то из-за Access я и затеял всю эту писанину). Кроме того, в стандартный дистрибутив BDE, который можно на каждом шагу найти в Интернете, я что-то ни разу не встречал SQL Links, впрочем, как я ни разу не встречал и отдельного дистрибутива SQL Links. А именно после установки SQL Links в BDE появлется возможность создавать алиасы к Access, MS SQL Server, Oracle и др. типам баз данных. Устанавливать же полную версию C++Builder или Delphi на компьютер пользователя может не каждый. А ODBC на "голой" машине уже содержит драйверы Access, Excel, FoxPro и SQL Server. В общем, для общего развития не помешает освоить и ODBC, тем более что access"овские базы, с которыми мы будем работать через ODBC, очень надежны (не в пример стандартным BDE"шным paradox"овым, у которых то и дело сыпятся индексы, а про такое поле как счетчик я вообще молчу), практически на любом компьютере пользователя установлен Office, что позволяет вносить коррективы "на месте", да и удобство всей базы в одном файле тоже иногда сказывается.

Фнукции, с которыми нам придется работать

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

1. Функция SQLDataSources возвращает список всех источников данных ODBC.

RETCODE SQLDataSources(HENV hEnv, UWORD fDirection, UCHAR * szDSN, SWORD cbDSNMax, SWORD *pcbDSN, UCHAR * szDescription, SWORD cbDescriptionMax, SWORD * pcbDescription);

  • hEnv - хэндл, возвращаемый функцией SQLAllocEnv();
  • fDirection - задает режим работы. Может принимать значения SQL_FETCH_FIRST - вернуть первую запись и SQL_FETCH_NEXT - вернуть следующую запись. Логика работы аналогична функциям FindFirst и FindNext (помните DOS?);
  • szDSN - указатель на буфер длиной не менее cbDSNMax, куда будет записано имя источника данных;
  • cbDSNMax - длина буфера szDSN;
  • pcbDSN - указатель на целое, куда записывается реальная длина (не включая завершающий \0) принятого имени источника данных;
  • szDescription - указатель на буфер длиной как минимум 255 символов, куда запистывается описание принятого источника данных;
  • cbDescriptionMax - длина буфера szDescription;
  • pcbDescripton - указатель на целое, куда записывается реальная длина описания источника данных.

2. Функция SQLConfigDataSources добавляет, изменяет или удаляет указанный источник данных.

BOOL SQLConfigDataSources(HWND hwndParent, WORD fRequest, LPCSTR lpszDriver, LPCSTR lpszAttributes)

  • hwndParent - хэндл родительского окна. Если не равен NULL, отображается стандартный для данного типа источника данных диалог настройки.
  • fRequest - тип запрашиваемой операции. Может принимать следующие значения:
    • ODBC_ADD_DSN (ODBC_ADD_SYS_DSN) - запрос на создание нового пользовательского (системного) источника данных;
    • ODBC_CONFIG_DSN (ODBC_CONFIG_SYS_DSN) - запрос на изменение существующего пользовательского (системного) источника данных;
    • ODBC_REMOVE_DSN (ODBC_REMOVE_SYS_DSN) - удаление пользовательского (системного) источника данных.
  • lpszDriver - указатель на строку, содержащую имя драйвера, ассоциированного с конкретным типом БД;
  • lpszAttributes - указатель на строку атрибутов в форме ключевое слово - значение. Каждая такая пара должна заканчиваться символом \0, в конце строки атрибутов должен стоять двойной символ \0.

Приведем несколько примеров строки атрибутов, чтобы вам было понятно, что это такое:

"DSN=MySource\0UID=MyLogin\0PWD=MyPass" - источник данных с именем MySource, логин - MyLogin, пароль - MyPass

Каждый драйвер "понимает" свои ключевые слова, чаще всего применяются:

PWD - пароль UID - логин DSN - имя источника данных DATABASE - имя базы данных SERVER - имя сервера, на котором находится база данных

Для баз данных Microsoft Access для указания имени БД вместо DATABASE используется ключевое слово DBQ.

3. Функция SQLAllocEnv создает новый хэндл для использования в других функциях и инициализирует интерфейс для работы с ODBC

RETCODE SQLAlocEnv(HENV * hEnv)

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

4. Функция SQLFreeEnv удаляет заданный хэндл и освобождает всю память, ассоциированную с ним.

RETCODE SQLFreeEnv(HENV hEnv)

  • hEnv - хэндл, который нужно удалить

Исходный код

Сначала несколько замечаний. В C++Builder есть заголовочные файлы для работы с ODBC. Нам нужно два из них - odbcinst.h и sql.h. Добавьте строки

#include #include

в начало вашего файла. Реализация функций, описанных в этих файлах, находится в нескольких DLL, лежащих в каталоге Windows\System (или WinNT\System32). В наших примерах будут использоваться две такие DLL, а именно odbc32.dll и odbccp32.dll. Чтобы подключить их к проекту, нужно проделать следующие шаги:

1. Запускаем любой досовский файл-менеджер или командную строку Windows и переходим в каталог Windows\System (WinNT\System32) и находим эти две библиотеки.

2. Если каталог BIN С++Builder"а прописан в переменной окружения PATH, просто набираем

C:\windows\system\> implib odbc32.lib odbc32.dll

иначе набираем полностью путь к файлу implib.exe, либо копируем его в каталог, прописанный в PATH.

3. То же самое проделываем с odbccp32.dll:

C:\windows\system\> implib odbccp32.lib odbccp32.dll

4 . Полученные.lib - файлы копируем в каталог с проектом

5 . Из меню Project выбираем пункт Add to Project... и поочередно добавляем odbc32.lib и odbccp32.lib.

Все, теперь система сама загрузит эти DLL во время запуска программы.

При мер 1: Получаем список уже созданных источников данных ODBC.

Const short SQL_MAX_DSN_LENGTH=255; UCHAR szDSN[ SQL_MAX_DSN_LENGTH+1 ]; UCHAR szDescription[ 256 ]; short wDSNLen; short wDesLen; int retCode; SQLHENV hEnv=NULL; AnsiString DSNName; SQLAllocEnv(&hEnv); retCode = SQLDataSources(hEnv, SQL_FETCH_FIRST, szDSN, SQL_MAX_DSN_LENGTH+1, &wDSNLen, szDescription, 256, &wDesLen); while(retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO) { DSNName = (AnsiString)((char *)szDSN); // -- получили имя DSN в переменной DSNName retCode = SQLDataSources(hEnv, SQL_FETCH_NEXT, szDSN, SQL_MAX_DSN_LENGTH+1, &wDSNLen, szDescription, 256, &wDesLen); } SQLFreeEnv(hEnv);

Этот фрагмент кода просто перебирает все уже созданные источники данных. В первой строке фрагмента после объявления переменных создается хэндл текущего сеанса работы с ODBC, затем выбирается первое имя DSN. Если первое имя успешно прочитано (retCode содержит константу SQL_SUCCESS), то в цикле выбирается следующий DSN и т.д. до тех пор, пока не будет прочитан последний DSN. Если на место комментария вставить код (ListBox1 -> Items -> Add(DSNName)), добавляющий прочитанное имя в ListBox, например, то вы сможете просмотреть весь этот список. А если на место комментария вставить что-нибудь типа

If (DSNName=="OurDSN") ...

то мы проверим, сможет ли наша программа работать нормально.

Пример 2: Создаем новый источник данных.

В этом примере вы узнаете, как создать системный DSN для базы данных Access. Предположим, файл с БД лежит в том же каталоге, что и программа, а его имя - db1.mdb.

#include WORD fRequest = ODBC_ADD_SYS_DSN; UCHAR lpszDriver = "Microsoft Access Driver (*.mdb)"; UCHAR lpszAttributes = "DSN=c2a;DBQ="; bool retCode; AnsiString CurDir; CurDir = GetCurrentDir(); StrCat(lpszAttributes, CurDir.c_str()); StrCat(lpszAttributes, "\\db1.mdb"); retCode = SQLConfigDataSource(NULL, fRequest, lpszDriver, lpszAttributes); if (retCode == true) Application -> MessageBox("DSN успешно создан", "Сообщение", MB_OK); else { Application -> MessageBox("Произошла ошибка во время создания DSN", "Ошибка", MB_OK); }

Как видите, здесь уже не нужны хэндлы и код достаточно ясный. В первых трех строках - дописываем в строку атрибутов путь к файлу БД. Затем собственно создаем источник. Обработка ошибок тривиальна.

Важное замечание: При создании DSN если такое имя уже есть, то не возвращается ошибка, а создается DSN с текущими параметрами.

Пример 3: Как все это собрать воедино и использовать в программе

Здесь кода не будет, здесь будет описание. Итак, у нас есть программа, которой нужно "присоединиться" к базе Microsoft Access, лежащей совсем рядом, в текущем каталоге. На машине пользователя нам не нужно ничего, кроме стандартного набора bpl и BDE. Но - теперь не нужны SQL Links, можно использовать, например, Install Shield, можно взять отдельный дистрибутив BDE. Поехали:

1. На основную форму проекта кидаем компоненту TDatabase. Устанавливаем ее свойства: LoginPrompt - false, DatabaseName - dbMain, AliasName - c2a (имя источника данных ODBC). Во всех компонентах TQuery или TTable свойство Database Name будет равно dbMain. Конечно, можно не использовать компоненту TDatabase, а в TQuery или TTable прямо указывать имя источника данных ODBC, но представьте, если вы написаи проект формочек на двадцать-тридцать, а потом решили, что имя источника "MySuperDSN" не в полной мере отражает всю вашу крутость:-) Изменять свойство у полусотни компонент - очень муторное занятие, поверьте.

2. В конструкторе основной формы прописываем код примера №1, вставляя на место комментария следующий код:

If (t == "c2a") { Exists = true; break; }

а после цикла - такой фрагмент:

If (!Exists) { NewDSN(); }

3. Функция NewDSN() полностью повторяет код примера №2.

Теперь при первом запуске программы будет создан источник данных ODBC Microsoft Access с именем c2a, ссылающийся на файл db1.mdb, лежащий в том же каталоге, что и программа.

4. На всякий непредвиденный случай (если вы переместили программу в другой каталог, поменялась буква диска или сетевое имя, где лежит база данных) можно в программе предусмотреть немедленное перезаписывание DSN по горячей клавише, что-то типа такого:

Void __fastcall TForm1::FormKeyDown(TObject *Sender, WORD &Key, TShiftState Shift) { if (Shift.Contains(ssAlt) && Shift.Contains(ssCtrl)) if (Key==VK_F1) { if (Application -> MessageBox("Перезаписать DSN?", "Вопрос",MB_YESNO)==IDYES) { NewDSN(); } } }

Здесь для перезаписи DSN используется комбинация Alt-Ctrl-F1

Страница 13 из 17

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

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

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

HKEY_CURRENT_USER\SOFTWARE\ODBC\ODBC.INI\

Еще один способ программно воздействовать на настройки драйверов ODBC - это использовать функцию SQLConfigDataSource() .

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

  • Утилита администрирования.
  • Реестр.
  • Функция SQLConfigDataSource() .

Функция SQLConfigDataSource()

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

BOOL SQLConfigDataSource
HWND hwndParent,// Указатель на окно вызвавшее функцию
WORD fRequest,// Тип запроса
LPCSTR lpszDriver,// Пользовательское имя драйвера
LPCSTR lpszAttributes// атрибуты
);

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

  • ODBC_ADD_DSN - Добавляем новый источник данных пользователя.
  • ODBC_CONFIG_DSN - Выбор конфигурации существующего источника данных пользователя.
  • ODBC_REMOVE_DSN - Удаляем существующий источник данных пользователя.
  • ODBC_ADD_SYS_DSN - Добавляем новый источник данных системы.
  • ODBC_CONFIG_SYS_DSN - Изменяем существующий источник данных системы.
  • ODBC_REMOVE_SYS_DSN - Удаляем существующий источник данных системы.
  • ODBC_REMOVE_DEFAULT_DSN - Удаляем заданный по умолчанию раздел спецификации источника данных из системы

Давайте попробуем???

// TestConfig.cpp: Defines the entry point for the console application.
//

#include "stdafx.h"
#include "windows.h"
#include "odbcinst.h"
#include "iostream.h"

void main()
{
if (!SQLConfigDataSource(NULL,ODBC_ADD_DSN,
"Microsoft Excel Driver (*.xls)",
"DSN=New Excel Data Source\0"
"Description=New Excel Data Source\0"
"FileType=Excel\0"
"DataDirectory=C:\\ExcelData\0"
"MaxScanRows=20\0"))
{
cout << "Error config ODBC" << endl;
}
}

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


В этой статье хочу рассказать как просто создать ODBC из командной строки в Windows XP.
ODBC строки подключения бывают Пользовательские, то есть доступны для текущего пользователя; Системные — доступны для всех пользователей компьютера и Файловые. Я использую системные. Для чего вообще нужно создавать из командной строки? Ведь можно просто зайти в и создать нужное соединение с базой вручную. Да, совершенно верно, можно и так. Но! Если у вас много компьютеров? А если вы передаете свой дистрибутив программы заказчику на самостоятельную установку? Проще делать это из командной строки.

Итак, для создания нового источника данных (или еще можно сказать — алиаса) ODBC из командной строки я использую встроенную в Windows XP утилиту odbcconf.exe . Вызвав "odbcconf /?" можно посмотреть ключи запуска. Всё очень просто: для создания системного источника нам нужен параметр CONFIGSYSDSN .
Проще будет показать примеры готовых cmd файлов.
Этот пример показывает создание источника данных с именем Alias базы MyBase для MS SQL сервера на сервере с именем SERVER и аутентификацией Windows:

Odbcconf CONFIGSYSDSN "SQL server" "DSN=Alias|Server=SERVER|database=MyBase|Trusted_Connection=Yes"

Пример создания источника для MS Access с именем Client для таблицы C:\client.mdb:

Odbcconf CONFIGSYSDSN "Microsoft Access Driver (*.mdb)" "DSN=Client|Driver=C:\WINDOWS\system32\odbcjt32.dll|FIL=MS Access|DBQ=C:\client.mdb|UID=DBA|PWD=pass|Description=Client"

Здесь Имя пользователя DBA , пароль pass , описание Client .

Видно, что для каждого типа источника, будь то MS SQL, Access или Visual FoxPro, нужны разные имена параметров. Все их знать не обязательно. И вот тут очень простая хитрость. Даже не хитрость, а так 🙂
Все системные источники данных хранятся в реестре Windows. Путь их хранения: . Если нужно создать источник данных для любого драйвера БД, я вручную создаю его через Панель управления — Администрирование — Источники данных (ODBC) , затем открываю реестр, нахожу созданный источник и в его значениях все эти имена параметров как на ладони. Например, нам нужно узнать какие параметры будут нужны в командной строке для создания источника подключения к Excel. Для этого вручную создаем источник с именем test к файлу c:\test.xls . Смотрим в реестр и видим:

Аккуратно переписываем параметры и получаем по аналогии с вышеуказанными примерами следующую командную строку для создания такого ODBC подключения:

Odbcconf CONFIGSYSDSN "Microsoft Excel Driver (*.xls)" "DSN=test|DBQ=c:\test.xls|DefaultDir=C:|Description=Test"

Итак, что мы имеем. Варьируя вручную параметры алиаса из Панели Управления и наблюдая результат в реестре Windows по адресу HKEY_LOCAL_MACHINE\SOFTWARE\ODBC\ODBC.INI\ , можно создать любой ODBC алиас из командной строки Windows.

Это всё. Если есть вопросы или у Вас есть что дополнить к этой теме, пишите в комментариях.

В книге описывается сервер сценариев Windows Script Host (WSH) версии 5.6, который является одним из стандартных компонентов Windows ХР, а также может быть установлен в более ранних версиях Windows. Приводятся сценарии на языках VBScript и JScript, иллюстрирующие применение стандартных объектов WSH 5.6, включая создание из сценариев дочерних процессов и запуск сценариев на удаленных компьютерах. В качестве более сложных примеров рассматриваются сценарии, работающие с базами данных, управляющие приложениями Microsoft Office, организующие графический пользовательский интерфейс, использующие технологии ADSI (Active Directory Service Interface) и WMI (Windows Management Instrumentation) для решения задач администрирования. Освещены вопросы практической работы с XML-файлами и создания СОМ-объектов. Особое внимание уделяется вопросам безопасности при работе со сценариями, приводятся конкретные примеры настроек политик безопасности. К книге прилагается дискета с исходными текстами большинства примеров.

Книга:

Для получения доступа к созданной DBF-таблице из сценария WSH мы воспользуемся технологией ODBC (Open DataBase Connectivity). ODBC - это стандартное средство Microsoft для работы с реляционными базами данных различных форматов и производителей, способное обрабатывать запросы к базам на языке SQL (Structured Query Language, язык структурированных запросов).

Замечание

Для начального ознакомления с языком SQL можно порекомендовать книгу .

Вначале нам понадобится завести в системе ODBC-запись для связи с нашей базой, т.е. создать новый DSN (Data Source Name, имя источника данных). В Windows ХР это делается следующим образом.

Загрузим Панель управления (Control Panel) Windows (меню Пуск (Start)) и переключимся к классическому виду (рис. 9.6).


Рис. 9.6. Классический вид панели управления Windows ХР

Последовательно выберем пункты Администрирование (Administrative tools) и Источники данных (ODBC) (Data sources (ODBC)). В появившемся диалоговом окне выберем вкладку Системный DSN (System DSN), что позволит создать DSN, доступный всем пользователям компьютера (рис. 9.7).


Рис. 9.7. Администратор источников данных ODBC в Windows ХР

Нажмем кнопку Добавить (Add) и в появившемся окне выберем драйвер Microsoft dBase Driver (*.dbf) (рис. 9.8).