Fetching BLOB Data Using IRow::GetColumns and ISequentialStream
The following function uses IRow::GetColumns and ISequentialStream to fetch large data.
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=0; 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);
if(FAILED(hr))
goto CLEANUP;
hr = pIColumnsInfo->GetColumnInfo(&cColumns, &prgInfo, &pColNames);
//Get Column ID
columnid = (prgInfo + (iCol))->columnid;
IUnknown* pUnkStream = NULL;
ZeroMemory(&column, sizeof(column));
column.columnid = prgInfo[iCol].columnid;
// Ask for Iunknown interface pointer
column.wType = DBTYPE_IUNKNOWN;
column.pData = (LPVOID*) &pUnkStream;
hr = pUnkRow->GetColumns(1, &column);
//Get ISequentialStream from Iunknown pointer retrieved from
//GetColumns()
hr = pUnkStream->QueryInterface(IID_ISequentialStream,
(LPVOID*) &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 cleanup.
return hr;
}
To fetch large data using IRow::GetColumns (or IRow::Open) and ISequentialStream