|
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, где есть теория и много других примеров на работу
с базами.
|
|