Выборка данных BLOB при помощи метода IRow::Open и интерфейса ISequentialStream
Метод IRow::Open поддерживает открытие только объектов типа DBGUID_STREAM или DBGUID_NULL.
Следующая функция использует метод IRow::Open и интерфейс ISequentialStream для выборки больших данных.
void InitializeAndExecuteCommand(){ ULONG iidx; WCHAR* wCmdString=OLESTR("SELECT * FROM MyTable"); // Do the initialization, create the session, and set command text. hr = pICommandText->Execute(NULL, IID_IRow, NULL, &cNumRows,(IUnknown **)&pIRow))) //Get 1 column at a time. for(ULONG i=1; i <= NoOfColumns; i++) GetSequentialColumn(pIRow, iidx); // Do the clean up.}HRESULT GetSequentialColumn(IRow* pUnkRow, ULONG iCol){ HRESULT hr = NOERROR; ULONG cbRead = 0; ULONG cbTotal = 0; ULONG cColumns = 0; ULONG cReads = 0; ISequentialStream* pIStream = NULL; WCHAR* pBuffer[kMaxBuff]; //50 chars read by ISequentialStream::Read() DBCOLUMNINFO* prgInfo; OLECHAR* pColNames; IColumnsInfo* pIColumnsInfo; DBID columnid; DBCOLUMNACCESS column; hr = pUnkRow->QueryInterface(IID_IColumnsInfo, (void**) &pIColumnsInfo); hr = pIColumnsInfo->GetColumnInfo(&cColumns, &prgInfo, &pColNames); // Get Column ID. columnid = (prgInfo + (iCol - 1))->columnid; // Get sequential stream object by calling IRow::Open. hr = pUnkRow->Open(NULL, &columnid, DBGUID_STREAM, 0, IID_ISequentialStream,(LPUNKNOWN *)&pIStream); ZeroMemory(pBuffer, kMaxBuff * sizeof(WCHAR)); // Read 50 chars at a time until no more data. do { hr = pIStream->Read(pBuffer, kMaxBuff, &cbRead); cbTotal = cbTotal + cbRead; // Process the data. } while(cbRead > 0);// Do the clean up. return hr;}
Большие данные могут быть привязаны или получены с использованием интерфейса ISequentialStream. Для привязанных столбцов флаг состояния указывает, усекаются ли данные при установке DBSTATUS_S_TRUNCATED.