Kommentar
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
IRow::Open supports only DBGUID_STREAM and DBGUID_NULL type of objects to be opened.
The following function uses IRow::Open 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=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;
}
Large data can be bound or retrieved by using the ISequentialStream interface. For bound columns, the status flag indicates if the data is truncated by setting DBSTATUS_S_TRUNCATED.