按照以下来自MSDN的代码访问sql server的image类型字段没有问题,
但是访问Oracle的BLOB和CLOB类型字段时在GetData()函数总是返回该列
为NULL,实际上是有值的,用的oledb provider为OraOLEDB.Oracle,
是安装oracle 9i时装上的,我没有其他版本的Oracle及其oledb provider,
无法测试其他版本有没有这个问题。请教各位达人,究竟要怎么样才能
返回BLOB字段的值呀!另外,类似代码插入和更新BLOB字段没有问题。 DBOBJECT ObjectStruct;
ObjectStruct.dwFlags = STGM_READ;
ObjectStruct.iid = IID_ISequentialStream; struct BLOBDATA
{
DBSTATUS dwStatus;
DWORD dwLength;
ISequentialStream* pISeqStream;
};
hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
cBindings,
rgBindings,
sizeof(BLOBDATA),
&hAccessor,
rgBindStatus);
if (FAILED(hr))
{
printf("Failed to create an accessor.\n");
//Release any references and return.
goto Exit;
} //end if //Now get the first row.
hr = pIRowsetChange->QueryInterface(IID_IRowset,
(void **)&pIRowset);
if (FAILED(hr))
{
printf("Failed to get IRowset interface.\n");
//Release any references and return.
goto Exit;
} //end if hr = pIRowset->GetNextRows(NULL,
0,
1,
&cRowsObtained,
&rghRows); hr = pIRowset->GetData(rghRows[0],
hAccessor,
&BLOBGetData); //Verify the retrieved data, only if data is not null.
if (BLOBGetData.dwStatus == DBSTATUS_S_ISNULL)
{
//Process null data
printf("Provider returned a null value.\n");
} else if(BLOBGetData.dwStatus == DBSTATUS_S_OK)
//Provider returned a nonNULL value
{
BLOBGetData.pISeqStream->Read(
pBuffer,
cBytes,
&cBytesRead);
if(memcmp(pBuffer, pReadData, cBytes) != 0)
{
//cleanup
} SAFE_RELEASE(BLOBGetData.pISeqStream);
}
但是访问Oracle的BLOB和CLOB类型字段时在GetData()函数总是返回该列
为NULL,实际上是有值的,用的oledb provider为OraOLEDB.Oracle,
是安装oracle 9i时装上的,我没有其他版本的Oracle及其oledb provider,
无法测试其他版本有没有这个问题。请教各位达人,究竟要怎么样才能
返回BLOB字段的值呀!另外,类似代码插入和更新BLOB字段没有问题。 DBOBJECT ObjectStruct;
ObjectStruct.dwFlags = STGM_READ;
ObjectStruct.iid = IID_ISequentialStream; struct BLOBDATA
{
DBSTATUS dwStatus;
DWORD dwLength;
ISequentialStream* pISeqStream;
};
hr = pIAccessor->CreateAccessor(DBACCESSOR_ROWDATA,
cBindings,
rgBindings,
sizeof(BLOBDATA),
&hAccessor,
rgBindStatus);
if (FAILED(hr))
{
printf("Failed to create an accessor.\n");
//Release any references and return.
goto Exit;
} //end if //Now get the first row.
hr = pIRowsetChange->QueryInterface(IID_IRowset,
(void **)&pIRowset);
if (FAILED(hr))
{
printf("Failed to get IRowset interface.\n");
//Release any references and return.
goto Exit;
} //end if hr = pIRowset->GetNextRows(NULL,
0,
1,
&cRowsObtained,
&rghRows); hr = pIRowset->GetData(rghRows[0],
hAccessor,
&BLOBGetData); //Verify the retrieved data, only if data is not null.
if (BLOBGetData.dwStatus == DBSTATUS_S_ISNULL)
{
//Process null data
printf("Provider returned a null value.\n");
} else if(BLOBGetData.dwStatus == DBSTATUS_S_OK)
//Provider returned a nonNULL value
{
BLOBGetData.pISeqStream->Read(
pBuffer,
cBytes,
&cBytesRead);
if(memcmp(pBuffer, pReadData, cBytes) != 0)
{
//cleanup
} SAFE_RELEASE(BLOBGetData.pISeqStream);
}
CMyImageSet * pMyImageSet = new CMyImageSet; try
{
pMyImageSet->Open();
}
catch(CException* pE)
{
pE->ReportError();
pE->Delete();
delete pMyImageSet;
return FALSE;
}
if (pMyImageSet->GetRecordCount()<=0)
{
return FALSE;
} m_strFileName = _T("Temp"); //°ÑͼÐÎÐÅÏ¢¶ÁÈëµ½ÎļþÖÐ
CFile outFile(m_strFileName, CFile::modeCreate | CFile::modeWrite);
LPSTR buffer = (LPSTR)GlobalLock(pMyImageSet->m_Image.m_hData);
outFile.WriteHuge(buffer,pMyImageSet->m_Image.m_dwDataLength);
GlobalUnlock(pMyImageSet->m_Image.m_hData); outFile.Close();
GlobalUnlock(pMyImageSet->m_Image.m_hData); delete pMyImageSet; if (m_ListImage.Load(m_strFileName) == FALSE)
{
return FALSE;
} CRect ViewRect; m_ImageData = m_ListImage.GetObjectData(); m_ImageWidth = m_ImageData.GetWidth();
m_ImageHeight = m_ImageData.GetHeight(); GetWindowRect(&ViewRect); m_w = (int)m_ImageWidth;
m_h = (int)m_ImageHeight;
m_x = 0;
m_y = 0; CClientDC dc(this); m_ImageData.Draw( dc, m_x, m_y, m_w, m_h, 0, 0, m_ImageWidth, m_ImageHeight);