Опубликован: 20.12.2005 | Уровень: специалист | Доступ: платный | ВУЗ: Московский государственный университет имени М.В.Ломоносова
Лекция 9:

Объектная модель OLE DB

< Лекция 8 || Лекция 9: 123 || Лекция 10 >

Объекты 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, поддерживающий управление точками соединения для соединяемых объектов.
< Лекция 8 || Лекция 9: 123 || Лекция 10 >
Ирина Шелтер
Ирина Шелтер
Россия, Нижний Новгород, НГПУ им. К.Минина, 2011
Михаил Бородай
Михаил Бородай
Россия, г. Москва