我有一块WORD型的数据,有128*128个WORD型的值,值都在600多左右
我将其存入BLOB字段中
然后读出 结果 读出的值都是40000多
不知哪里出问题了 请教大家 谢谢
//插入一下记录
int m_nFileLen = 128*128;
m_pBlock = new WORD[m_nFileLen];
memset(&m_pBlock,0,m_nFileLen);
for(int i = 0;i<128;i++)
{
for(int j=0;j<128;j++) m_pBlock[i*128+j] = (int)pDoc->m_pDib->pData_Cloud[i*1200+j];
}
WORD *pBuf = m_pBlock;
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1]; m_pRecordset->AddNew();
if(pBuf)
{    
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = m_nFileLen;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i < (long)m_nFileLen; i++)
 SafeArrayPutElement (psa, &i, pBuf++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa; m_pRecordset->GetFields()->GetItem("Block_data")->AppendChunk(varBLOB);
}
m_pRecordset->Update(); delete m_pBlock;
//读取
CString strSQL,str;
if(m_pBMPBuffer)
{
delete m_pBMPBuffer;
m_pBMPBuffer = NULL;
}
m_pRecordset.CreateInstance(__uuidof(Recordset));
if ( m_pRecordset->State == adStateOpen) m_pRecordset->Close();
try
{
strSQL.Format("SELECT * FROM RASBLOCK_%d",rfid);
m_pRecordset->Open(_bstr_t(strSQL),_variant_t((IDispatch *)theApp.m_pConnection.GetInterfacePtr()),adOpenDynamic,adLockOptimistic,adCmdUnknown);

long lDataSize = m_pRecordset->GetFields()->GetItem("Block_data")->ActualSize;
if(lDataSize > 0)
{
_variant_t varBLOB;
varBLOB = m_pRecordset->GetFields()->GetItem("Block_data")->GetChunk(lDataSize);
if(varBLOB.vt == (VT_ARRAY | VT_UI1))
{
if(m_pBMPBuffer = new WORD[lDataSize]) ///重新分配必要的存储空间
{
WORD *pBuf = NULL;
SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
memcpy(m_pBMPBuffer,pBuf,lDataSize); ///复制数据到缓冲区m_pBMPBuffer
SafeArrayUnaccessData (varBLOB.parray);

解决方案 »

  1.   

    先指出一个错误
    int m_nFileLen = 128*128;//这是WORD数组的元素个数,不是字节数
    m_pBlock = new WORD[m_nFileLen];
    memset(&m_pBlock,0,m_nFileLen);//这里第三个参数是字节数,要m_nFileLen*sizeof(WORD)
      

  2.   

    BLOB通常都是操作字节数组BYTE *pBuf = (BYTE *)m_pBlock;
    rgsabound[0].cElements = m_nFileLen*sizeof(WORD);//安全数组里存放的应该是字节数,不是WORD的元素数
    for (long i = 0; i < (long) m_nFileLen*sizeof(WORD); i++)
     SafeArrayPutElement (psa, &i, pBuf++);
      

  3.   

    if(m_pBMPBuffer = new WORD[lDataSize/sizeof(WORD)])///重新分配必要的存储空间,lDataSize是字节数,数组的元素数应该是lDataSize/sizeof(WORD)
    {
    BYTE *pBuf = NULL;
    SafeArrayAccessData(varBLOB.parray,(void **)&pBuf);
    memcpy(m_pBMPBuffer,pBuf,lDataSize);///复制数据到缓冲区m_pBMPBuffer
    SafeArrayUnaccessData (varBLOB.parray);
      

  4.   

    memset(&m_pBlock,0,m_nFileLen); //此行有1楼说的错误rgsabound[0].cElements = m_nFileLen; //此行也有错误他是以字节为单位的. m_nFileLen * sizeof(WORD)SafeArrayPutElement (psa, &i, pBuf++); //这个也不对pBuf是WORD* 不是BYTE*因此必须转换否则WORD两个字节中他将丢掉一个应该这样:m_nFileLen *= sizeof(WORD);ZeroMemory(&m_pBlock,m_nFileLen);
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = m_nFileLen;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
    BYTE *ptemp = (BYTE*)pBuf;
    for (long i = 0; i <m_nFileLen; i++)
    SafeArrayPutElement (psa, &i, ptemp ++);
    varBLOB.vt = VT_ARRAY | VT_UI1;
    psa;m_pRecordset->GetFields()->GetItem("Block_data")->AppendChunk(varBLOB);
    }
      

  5.   


        参考:
    VC ADO Oracle 读写BLOB