Pers.narod.ru. Обучение. Примеры по 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, где есть теория и много других примеров на работу
с базами.
гостевая; E-mail |