Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кожин / Лекции / Лекция 12 ODBC.doc
Скачиваний:
39
Добавлен:
20.03.2016
Размер:
693.25 Кб
Скачать
      1. Функции IsOpen

Функции IsOpen возвращает значение отличное от нуля, если связь установлена.

CDatabase MyDB;

MyDB.Open("MS Access 97 Database");

if (MyDB.IsOpen())

{

//соединение установлено......

}

//......

      1. Функция GetConnect()

Функция GetConnect() возвращает строку CString, в которой перечислены все параметры используемые при установке соединения.

// const CString& GetConnect();

if (MyDB.IsOpen())

{

AfxMessageBox(MyDB.GetConnect());

}

      1. Имя базы данных

Имя базы данных, с которой установлено соединение соединение можно получить через функцию GetDatabaseName.

MyDB.Open("MS Access 97 Database");

if (MyDB.IsOpen())

{

AfxMessageBox(MyDB.GetDatabaseName());

}

Эта функция позволяет на основе псевдонима узнать настоящее имя - т.е. где и какая конкретно база данных открыта.

      1. Функция CanUpdate

Функция позволят определить флаг можно ли вносить в базу данных изменения. То есть убедимся, что открыли в режиме отличном от Read Only. Для этого воспользуемся функцией CanUpdate.

MyDB.Open("MS Access 97 Database");

if (MyDB.IsOpen())

{ if (MyDB.CanUpdate()) AfxMessageBox("Update разрешен "); }

      1. Функцию CanTransact().

Функция позволяет установить можно ли использовать режим транзакций. Не все драйвера ODBC имеют данную возможность.

if (cdbMyDB.IsOpen())

if (cdbMyDB.CanTransact()) AfxMessageBox("Transact разрешен");

    1. Набор записей

Recordset - это источник строк (записей таблицы). Этот объект можно рассматривать как оболочку для строк или колонок таблицы. То есть этот объект может включать, как всю таблицу, так и часть её на основе SQL запроса. В файле базы данных может храниться не одна таблица. Базы данных для этого и предусмотрены. Только старые версии персональных баз данных типа FoxPro хранят каждую таблицу в отдельном файле.

      1. Создание объекта 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, общедоступная и может быть использована в любой момент.

      1. Открытие набора записей

Имея созданный объект 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);

}

}

Соседние файлы в папке Лекции