读书人

ADO中 用AppendChunk读去image字段,读

发布时间: 2012-02-29 16:44:11 作者: rapoo

ADO中 用AppendChunk读去image字段,读取后的图片打不开
ADO中 用AppendChunk读去image字段,读取后的图片打不开


代码如下:
try
{

lstate = m_pRecordset-> State;
if(lstate == adStateOpen)
m_pRecordset-> Close();
m_pRecordset-> Open((_bstr_t)szCommand,
m_pConnection.GetInterfacePtr(),
adOpenDynamic,
adLockOptimistic,
adCmdText);


Fields *pFields = m_pRecordset-> GetFields();
Field *pField = pFields-> GetItem( "other3 ");


CFile imagefile;
if(0 == imagefile.Open( "C:\\WINNT\\Blue Lace 16.bmp ",CFile::modeRead))
return;
long nLength = imagefile.GetLength();
BYTE *pbuf = NULL;
BYTE *pBufEx = NULL;


//存
pbuf = new BYTE[nLength];
pBufEx = pbuf;
if(pbuf == NULL)
return; //allocate memory error;
imagefile.Read(pbuf,nLength); //read the file into memory

//build a SAFFERRAY
SAFEARRAY* psa;
SAFEARRAYBOUND rgsabound[1];
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nLength;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);

for (long j = 0; j < nLength; j++)
SafeArrayPutElement (psa, &j, pBufEx++);
VARIANT varBLOB;
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
pField-> AppendChunk(varBLOB);
m_pRecordset-> Update();
delete []pbuf;


//取

VARIANT varBLOB2;
pField-> get_ActualSize(&nLenth); //这里取出来的长度和上面存入的长度一致
varBLOB2 = pField-> GetChunk(nLenth); //运行到这句的时候,异常抛出.
if(varBLOB2.vt == (VT_ARRAY | VT_UI1))
{
pbuf = (BYTE*)GlobalAlloc(GMEM_FIXED,nLenth);
SafeArrayAccessData(varBLOB2.parray,(void **)pbuf);

//Build a File in Windows Temp Directory
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);
CString strFileName = "temp.bmp ";


strFileName = tmpPath+strFileName;

CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
LPSTR buffer = (LPSTR)GlobalLock((HGLOBAL)pbuf);
outFile.WriteHuge(buffer,nLenth);
GlobalUnlock((HGLOBAL)pbuf);
outFile.Close();

SafeArrayUnaccessData (varBLOB2.parray);
}

}
catch(...)
{
AfxMessageBox( "E ");
}


[解决办法]
_variant_t varBLOB2;
pField-> get_ActualSize(&nLenth);
varBLOB2 = pField-> GetChunk(nLenth);
建议使用_variant_t,不要直接使用VARIANT
以下是我自己的测试代码,是可用的
_variant_t varBLOB;
varBLOB = pRs-> GetFields()-> GetItem( "img ")-> GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))///判断数据类型是否正确
{
char *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf2);
///得到指向数据的指针
/*****在这里我们可以对pBuf中的数据进行处理*****/

HANDLE hFile= CreateFile(
_T( "c:\\tx2.jpg "),
GENERIC_READ | GENERIC_WRITE,
FILE_SHARE_READ ,
NULL,
CREATE_NEW | OPEN_ALWAYS,
FILE_ATTRIBUTE_NORMAL,
NULL
);

DWORD writtedSize=0;
WriteFile(hFile,pBuf2,lDataSize,&writtedSize,NULL);
CloseHandle(hFile);
SafeArrayUnaccessData(varBLOB.parray);
}

读书人网 >VC/MFC

热点推荐