Nickolay.info. Обучение. Примеры по C++ Builder. Подключаем базу данных Access из C++ Builder

Вызвавшие статью к жизни вопросы таковы:

Удобней всего работать с базой данных Access через ADO Connection.

Поскольку работа со стандартными средствами BDE устарела еще лет 8 назад, самое простое на сегодня решение - ADO. Удобно в нем то, что не надо устанавливать ODBC-драйвера, идушие в составе Microsoft Office. Достаточно иметь на машине установленный Access - но он наверняка есть, раз Вы захотели программно подключить файл *.MDB :)

Во-первых, можно программно регистрировать псевдоним базы данных Access.

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

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

const int 	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,
		           256,
			   &wDSNLen,
                            szDescription,
			     LENGTH + 1,
                            &wDesLen);
   while( retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO )
   {
	  DSNName = (AnsiString)((char *)szDSN);
	  if(DSNName == "BD")BD_is_ISSET = true;
	  retCode = SQLDataSources( hEnv,
				       SQL_FETCH_NEXT,
				       szDSN,
				       SQL_MAX_DSN_LENGTH+1,
				       &wDSNLen,
				       szDescription,
				       256,
				       &wDesLen);
   }
  SQLFreeEnv( hEnv );

  if (!BD_is_ISSET)
  {
	WORD 		fRequest = ODBC_ADD_SYS_DSN;
	UCHAR 		lpszDriver[] = "Microsoft Access Driver (*.mdb)";
	UCHAR 		lpszAttributes[255] = "DSN=BD;DBQ=";
	bool 		retCode;
	AnsiString 	CurDir;

	CurDir = GetCurrentDir();
	StrCat(lpszAttributes, CurDir.c_str());
	StrCat(lpszAttributes, "\\BD.mdb");
	retCode = SQLConfigDataSource(NULL, fRequest, lpszDriver, lpszAttributes);
	if (retCode == false)
	{
	  Application -> MessageBox("Произошла ошибка во время создания DSN",
		   "Ошибка", MB_OK);
	}
  }

Для работы кода нужно подключить библиотеки odbc32.dll и odbccp32.dll.
Это можно сделать следующим образом:
Выполнить в режиме командной строки следующее:
C:\WINDOWS\SYSTEM32\implib -a odbc32.lib odbc32.dll
C:\WINDOWS\SYSTEM32\implib -a odbccp32.lib odbccp32.dll
Скопировать файлы odbc32.lib и odbccp32.lib из папки C:\WINDOWS\SYSTEM32\ в папку с проектом.
Нажать в C++ Builder Shift+F11 и добавить библиотеки к проекту.
Скомпилировать проект. Если появляются ошибки линковки, добавить определение
#define WIN32
в самую первую позицию файла с кодом.

Во-вторых, самое лучшее и простое - вообще ничего не регистрировать :) Вот весь процесс разработки приложения:

Создаем в Access, например, базу со следующей простейшей структурой (2 поля):
Name - текстовое поле;
Surname - текстовое поле.

Ключевые поля не заданы, база сохранена и совершенно пуста.

Создаем в C++ Builder новый проект, сохраняем его в папку базы.

С вкладки ADO добавляем компонент ADOConnection, в его свойство Provider пишем MSDataShape.1

Нам нужен хотя бы 1 запрос, с текущей вкладки добавляем ADOQuery, для его свойства Connection выбираем ADOConnection1, а свойство LoginPrompt в значение false (а то будет запрос логина и пароля).

Чтобы открыть соединение с БД нужно, по идее, установить свойство Active = true, но мы этого делать не будем, так как не прописывали базу.

Запросов без SQL-кода не бывает, поэтому открываем свойство SQL встроенной кнопочкой "..." и пишем какой-нибудь запрос, например,
select * from Table1
если, конечно, при сохранении таблицы в Access Вы назвали ее Table1.

Для связи приложения с таблицей нужен компонент DataSource с вкладки Data Access, выбираем его и щелкаем на ADOQuery1 в дереве объектов. Теперь у запроса есть источник данных. Свойство DataSet у DataSource1 равно ADOQuery1.

С вкладки Data Controls добавляем 2 компонента DBEdit, которые нужны для работы с 2 полями нашей базы. Свойство DataSource у обеих компонентов ставим в DataSource1. У первого компонента DataField = Name, у второго Surname. Если появляется окно с ошибкой, шлем его лесом.

Чтобы перемещаться по базе, кидаем на форму также DBNavigator со вкладки Data Controls. Выбираем у него DataSource=DataSource1, включаем также свойство ShowHint. Я также отключил у DBNavigator1 последнюю кнопку Update, раскрыв в списке свойство VisibleButtons и выбрав nbRefresh = false.

Теперь неплохо бы прописать базу при старте программы. Для этого вставляем в конструктор формы

__fastcall TForm1::TForm1(TComponent* Owner)
        : TForm(Owner)
{
 //сюда вставляем код!
}
следующий код:
 String pr,dpr;
 pr="MSDataShape.1";
 dpr="Microsoft.Jet.OLEDB.4.0";
 String tmp = ExtractFilePath(Application->ExeName) + "db1.mdb";
 const String ConnStr = "Provider=%s;Data Provider=%s;Data Source=%s";
 if (!ADOConnection1->Connected) {
  ADOConnection1->ConnectionString = Format (ConnStr,
   ARRAYOFCONST((pr,dpr,tmp)));
   ADOQuery1->Open();
  }

В принципе, это все, но давайте еще для порядка сделаем кнопочку вроде Add, продублировав одну из функций навигатора: со вкладки Standard добавляем обычную Button и ставим ей OnClick код вроде
ADOQuery1->Append();

Как и в любых других проектах, которые Вы собираетесь компилировать так, чтоб они запускались на машинах без установленного C++ Builder, нужно перед сборкой снять следующие флажки:

Делаем File -> Save all и Project -> Bulid Project1.

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

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

Скачать:
Проект "подключение БД Access с исходниками" (архив db_access.zip, 441 Кб, проект C++ Builder 6)

Добавим, что в ADO ещё у двух компонентов есть возможность подключаться к базе данных, Эти компоненты - ADOTable и ADOQuery, также имеют ConnectionString с таким же принципом настройки.

См. также:
в работах по Delphi лабораторную 9 - "Базы данных". Поскольку библиотека VCL одна и та же, принципы разработки не меняются;
в работах по C++ лабораторную 15, где есть теория и много других примеров на работу с базами.

Рейтинг@Mail.ru

вверх гостевая; E-mail