
- •Работа с базой данных через odbc.
- •Общий обзор odbc
- •Хранение настроек об источнике данных odbc
- •Утилита администрирования
- •Реестр операционной системы
- •Функция sqlConfigDataSource()
- •Класс cDatabase
- •Установка соединения
- •Настройка файлового соединения
- •Настройка пользовательского соединения
- •Пример приложения для работы с бд
- •Функции IsOpen
- •Открытие набора записей
- •Получение информации о результате запроса
- •Записи в cRecordset
- •Перемещения по записям
- •Фильтры, сортировка cRecordset
- •Обмен данными с таблицей
- •Добавления новой записи в Базу данных.
- •Редактирование записей
- •Удаление записей
- •Поддержка транзакций
- •Настройка odbc и текущий каталог
- •Выполнение функций odbc api из класса cDatabase
Функции IsOpen
Функции IsOpen возвращает значение отличное от нуля, если связь установлена.
CDatabase MyDB;
MyDB.Open("MS Access 97 Database");
if (MyDB.IsOpen())
{
//соединение установлено......
}
//......
Функция GetConnect()
Функция GetConnect() возвращает строку CString, в которой перечислены все параметры используемые при установке соединения.
// const CString& GetConnect();
if (MyDB.IsOpen())
{
AfxMessageBox(MyDB.GetConnect());
}
Имя базы данных
Имя базы данных, с которой установлено соединение соединение можно получить через функцию GetDatabaseName.
MyDB.Open("MS Access 97 Database");
if (MyDB.IsOpen())
{
AfxMessageBox(MyDB.GetDatabaseName());
}
Эта функция позволяет на основе псевдонима узнать настоящее имя - т.е. где и какая конкретно база данных открыта.
Функция CanUpdate
Функция позволят определить флаг можно ли вносить в базу данных изменения. То есть убедимся, что открыли в режиме отличном от Read Only. Для этого воспользуемся функцией CanUpdate.
MyDB.Open("MS Access 97 Database");
if (MyDB.IsOpen())
{ if (MyDB.CanUpdate()) AfxMessageBox("Update разрешен "); }
Функцию CanTransact().
Функция позволяет установить можно ли использовать режим транзакций. Не все драйвера ODBC имеют данную возможность.
if (cdbMyDB.IsOpen())
if (cdbMyDB.CanTransact()) AfxMessageBox("Transact разрешен");
Набор записей
Recordset - это источник строк (записей таблицы). Этот объект можно рассматривать как оболочку для строк или колонок таблицы. То есть этот объект может включать, как всю таблицу, так и часть её на основе SQL запроса. В файле базы данных может храниться не одна таблица. Базы данных для этого и предусмотрены. Только старые версии персональных баз данных типа FoxPro хранят каждую таблицу в отдельном файле.
Создание объекта Recordset
Для создания объекта необходимо объявить переменную. Объект создается на основе конструктора.
CRecordset( CDatabase* pDatabase = NULL);
В конструктор можно передать указатель на объект типа CDatabase, который отвечает за доступ к базе данных. Конструктор предусматривает и простое создание без передачи обьекта CDatabase. Действительно манипулируя доступными данными есть возможность в последствии прикрепить класс CDatebase.
Использование конструктора.
if (MyDB.IsOpen())
CRecordset cr(&MyDB);
Или например:
if (MyDB.IsOpen())
{
CRecordset cr;
cr.m_pDatabase=&MyDB;
}
В плане использования два предыдущих конструктора идентичны, и в плане функциональности тоже. Переменная m_pDatabase, в которой хранится указатель на базу данных в виде указателя на класс CDatabase, общедоступная и может быть использована в любой момент.
Открытие набора записей
Имея созданный объект CRecordset можно открыть таблицу на основе SQL запроса.
cr.Open(CRecordset::forwardOnly,"SELECT * FROM TABLE1; "
,CRecordset::readOnly);
Подразумевается, что в базе данных присутствует таблица Table1. Вызов данной функции может вызвать исключительные ситуации следующих типов:
CDBException
CMemoryException;
Например:
CRecordset cr;
cr.m_pDatabase=&MyDB;
try
{
cr.Open(CRecordset::forwardOnly,"SELECT * FROM TABLE1;",
CRecordset::readOnly);
cr.Close();
}
catch(CDBException db)
{
AfxMessageBox(db.m_strStateNativeOrigin);
}
Класс CRecordset имеет функцию IsOpen она знакома из класса CDatabase:
if (cr.IsOpen()) ......;
При открытии набора записей есть несколько типов:
CRecordset::dynaset
CRecordset::snapshot
CRecordset::dynamic
CRecordset::forwardOnly
snapshot - набор записей типа моментального снимка (Snapshot-type Recordset). Набор записей статического типа или, другими словами, типа моментального снимка (Snapshot-type Recordset) содержит копию данных, которую нельзя изменять. Этот тип набора записей удобно использовать для поиска записи, удовлетворяющей какому-либо критерию, или при генерации отчетов. Следует помнить, что при использовании этого набора записей содержимое всех полей заносится в память, что может потребовать значительных ресурсов памяти.
void CDatebaseDlg::OnOpen()
{
CDatabase cdbMyDB;
cdbMyDB.OpenEx("DSN=123");
if (cdbMyDB.IsOpen())
{
CRecordset cr(&cdbMyDB);
try
{
cr.Open(CRecordset::snapshot,
"SELECT Family FROM TABLE1", CRecordset::readOnly );
if (cr.IsOpen()) AfxMessageBox("Open");
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}
else AfxMessageBox("Not Open");
cdbMyDB.Close();
}
Для связи с базой данных использована функция OpenEx. Она сразу открывает и инициализирует связь с базой данных и рекомендована к использованию. В ней указан драйвер в формате DNS=name.
Набор строк можно проверить IsOpеn. Этот код защищен от ошибок.
void CDatebaseDlg::OnOpen()
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::snapshot,
"SELECT Family FROM TABLE1", CRecordset::readOnly );
if (cr.IsOpen()) AfxMessageBox("Open");
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}
или
void CDatebaseDlg::OnOpen()
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::snapshot,
"SELECT Family,Count FROM TABLE1", CRecordset::readOnly );
//........
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}