首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

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

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

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);
}

热点排行