Поделиться через


Выборка данных BLOB при помощи метода IRow::GetColumns и интерфейса ISequentialStream

Следующая функция использует методы IRow::GetColumns и 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=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;}