Базы данныхИнтернетКомпьютерыОперационные системыПрограммированиеСетиСвязьРазное
Поиск по сайту:
Подпишись на рассылку:

Назад в раздел

Программное управление источниками данных ODBC - исходный код приложения
<< предыдущая страница  

Исходный код

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

#include <odbcinst.h>
#include <sql.h>

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

1. Запускаем любой досовский файл-менеджер или командную строку Windows и переходим в каталог WindowsSystem (WinNTSystem32) и находим эти две библиотеки.
2. Если каталог BIN С++Builder'а прописан в переменной окружения PATH, просто набираем

c:windowssystem> implib odbc32.lib odbc32.dll

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

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

c:windowssystem> 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 <sysutils.hpp>

   WORD fRequest = ODBC_ADD_SYS_DSN;
   UCHAR lpszDriver[] = "Microsoft Access Driver (*.mdb)";
   UCHAR lpszAttributes[255] = "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

Ну, вот и все. Надеюсь, я чем-то вам помог.

Удачного программирования!

<< предыдущая страница  


  • Главная
  • Новости
  • Новинки
  • Скрипты
  • Форум
  • Ссылки
  • О сайте




  • Emanual.ru – это сайт, посвящённый всем значимым событиям в IT-индустрии: новейшие разработки, уникальные методы и горячие новости! Тонны информации, полезной как для обычных пользователей, так и для самых продвинутых программистов! Интересные обсуждения на актуальные темы и огромная аудитория, которая может быть интересна широкому кругу рекламодателей. У нас вы узнаете всё о компьютерах, базах данных, операционных системах, сетях, инфраструктурах, связях и программированию на популярных языках!
     Copyright © 2001-2024
    Реклама на сайте