Note
Access to this page requires authorization. You can try signing in or changing directories.
Access to this page requires authorization. You can try changing directories.
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;
}