Extraction de données BLOB à l'aide d'IRow::Open et ISequentialStream
IRow::Open prend uniquement en charge l'ouverture des types d'objets DBGUID_STREAM et DBGUID_NULL.
La fonction suivante utilise IRow::Open et ISequentialStream pour extraire des données volumineuses.
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;
}
Des données volumineuses peuvent être liées ou extraites à l'aide de l'interface ISequentialStream. Pour les colonnes dépendantes, l'indicateur d'état indique si les données sont tronquées en définissant DBSTATUS_S_TRUNCATED.