Объектная модель OLE DB
Объекты COMMAND
Перед использованием объекта Command следует определить, поддерживается ли данный объект. Для этого с помощью метода QueryInterface следует запросить интерфейс IDBCreateCommand объекта "сеанс".
Объект Command должен реализовывать следующие интерфейсы:
- Icommand ;
- Iaccessor ;
- IcommandText ;
- IcolumnInfo ;
- ICommandProperties.
Для создания команды вызывается метод IDBCreateCommand::CreateCommand объекта "сеанс".
Например:
ICommandText pICommandText;
HRESULT hr= pIDBCreateCommand-> CreateCommand(
NULL, // если есть агрегирование, то указатель
// на управляющий IUnknown
IID_ICommandText, // Запрашиваемый интерфейс
(IUnknown**)& pICommandText); // Указатель
// на запрашиваемый интерфейсТекст, выполняемый командой, устанавливается при вызове метода ICommandText::SetCommandText. При этом указывается уникальный идентификатор GUID синтаксиса команды (например, DBGUID_SQL (только для версий OLE DB начиная с 1.5)).
Например:
pICommandText->SetCommandText(DBGUID_SQL,
"SELECT * FROM TBL1");Для выполнения команды вызывается метод ICommand::Execute (этот метод наследуется интерфейсом ICommandText ).
Например:
ULONG ulRs=0;
IRowset** ppRowsets=NULL;
HRESULT hr= pICommandText->Execute (
NULL, // если есть агрегирование, то указатель
// на управляющий IUnknown
IID_IRowset, // Запрашиваемый интерфейс
NULL, // Указатель на структуру типа
// struct DBPARAMS {
// void *pData;
// DB_UPARAMS cParamSets;
// HACCESSOR hAccessor;
//};
ulRs, // Количество строк, на которые
// воздействовала команда INSERT, UPDATE
//или DELETE
(IUnknown**)& ppRowsets); // Указатель на
// указатели наборов данныхАлгоритм выполнения команды приведен на следующей схеме:
До выполнения команды можно определить поведение создаваемого результирующего набора вызовом метода ICommandProperties::SetProperties.
Для многократного выполнения запроса и при использовании параметров следует вызвать метод ICommandPrepare::Prepare, а затем определить параметры вызовом метода ICommandWithParameters::SetParameterInfo.
Если в результате выполнения команды возвращается несколько результирующих наборов, то используется метод IMultipleResults::GetResult.
Объекты TRANSACTION
Применение OLE DB позволяет поддерживать простые, вложенные и распределенные транзакции.
Объект Session для работы с транзакциями поддерживает следующие интерфейсы:
- интерфейс ITransactionLocal. Для начала транзакции вызывается метод ITransactionLocal::StartTransaction(). Если этот метод вызывается из активной транзакции, то открывается новая вложенная транзакция;
- интерфейс ITransaction, поддерживающий методы Abort, Commit и GetTransactionInfo ;
- интерфейс ITransactionJoin, реализующий поддержку распределенных транзакций.
Объект Transaction позволяет реализовывать более широкие возможности управления транзакциями, поддерживая следующие интерфейсы:
- ITransaction, позволяющий выполнить прерывание транзакции (методы Abort, Commit, GetTransactionInfo );
- IConnectionPointContainer, поддерживающий управление точками соединения для соединяемых объектов.
