На машине локально установлен oracle сервер 9.2.0.1.0. Система Windows XP. В студии 2005 на с++ пишу проект для работы с oracle через OLE DB. Все работает, КРОМЕ: не могу прочитать блоб.
Код стандартный:
hr = m_pICommandText->SetCommandText(DBGUID_DEFAULT, "SELECT bfield FROM tbl WHERE rowid=0");
hr = m_pICommandText->Execute(NULL, IID_IRowset, NULL, NULL, (IUnknown**)&m_pQrIRowset);
hr = m_pQrIRowset->QueryInterface(IID_IAccessor, (void**)&m_pQrIAccessor);
DBBINDSTATUS rgStatus[1];
DBOBJECT ObjectStruct;
ULONG ulbindstatus;
ULONG cRowsObtained = 0;
UINT cbRow = sizeof(IUnknown*) + sizeof(ULONG);
m_pBlobRow = new BYTE[cbRow];
hr = m_pQrIRowset->GetNextRows(NULL, 0, 1, &cRowsObtained, &m_rghQrRows);
ObjectStruct.dwFlags = STGM_READ;
ObjectStruct.iid = IID_ISequentialStream;
m_prgQrBindings[0].iOrdinal = 1;
m_prgQrBindings[0].obValue = 0;
m_prgQrBindings[0].obLength = 0;
m_prgQrBindings[0].obStatus = sizeof(IUnknown*);
m_prgQrBindings[0].pTypeInfo = NULL;
m_prgQrBindings[0].pObject = &ObjectStruct;
m_prgQrBindings[0].pBindExt = NULL;
m_prgQrBindings[0].dwPart = DBPART_VALUE | DBPART_STATUS;
m_prgQrBindings[0].dwMemOwner = DBMEMOWNER_CLIENTOWNED;
m_prgQrBindings[0].eParamIO = DBPARAMIO_NOTPARAM;
m_prgQrBindings[0].cbMaxLen = 0;
m_prgQrBindings[0].dwFlags = 0;
m_prgQrBindings[0].wType = DBTYPE_IUNKNOWN;
m_prgQrBindings[0].bPrecision = 0;
m_prgQrBindings[0].bScale = 0;
hr = m_pQrIAccessor->CreateAccessor(DBACCESSOR_ROWDATA, 1, m_prgQrBindings, sizeof(IUnknown*) + sizeof(ULONG), &m_hQrAccessor, rgStatus);
hr = m_pQrIRowset->GetData(m_rghQrRows[0], m_hQrAccessor, m_pBlobRow);
m_BlobReadStatus = (ULONG)((BYTE*)m_pBlobRow)[m_prgQrBindings[0].obStatus];
m_pBlobISequentialStream = *((ISequentialStream**)(m_pBlobRow + (m_prgQrBindings[0]).obValue));
Проблема в том, что m_BlobReadStatus всегда возвращается DBSTATUS_S_ISNULL и соответственно m_pBlobISequentialStream — некорректный указатель.
Хотя поле не NULL и содержит правильные данные.
SOS!!!