把位图写入数据库的时候出错:
代码如下
_bstr_t sql;
CString a;
a.Format("SELECT * FROM Employees WHERE Emp_Id='%d'",iEmpId);
//执行SELECT语句
sql=a;
_RecordsetPtr m_pRecord;
m_pRecord=m_ADOconn.GetRecordSet(sql);
//要明白下面的思路,把位图图象读入数据库中去
VARIANT varBLOB;
SAFEARRAY *pas;//定义一个数组
    SAFEARRAYBOUND rgsabound[1];
    rgsabound[0].lLbound=0;
rgsabound[0].cElements=m_filelen;
pas=SafeArrayCreate(VT_UI1,1,rgsabound);
for(long i=0;i<(long)m_filelen;i++)
SafeArrayPutElement(pas,&i,m_pBuffer++);
varBLOB.vt=VT_ARRAY|VT_UI1;
    varBLOB.parray=pas;
//调用AppendChunk()函数将图象写入数据库
m_pRecord->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);
//更新数据库
    m_pRecord->Update();
请给与解释!!!

解决方案 »

  1.   

    我也碰到一样的问题!
    这句m_pRecord->GetFields()->GetItem("Photo")->AppendChunk(varBLOB);运行到AppendChunk就报错。
    等待高手解答啊!
      

  2.   

    贴个代码,和你们实现应该有点不一样
    void CUploadPicDlg::OnButton2() 
    {
    // TODO: Add your control notification handler code here
    _CommandPtr     Cmd1;
    ParametersPtr   *Params1 = NULL;   // Not an instance of a smart pointer.
    _ParameterPtr   Param1;
    _RecordsetPtr   Rs1;

    //try

    // Create Parameter Object
    //定义文件
    CFile f("c:\\aaa.jpg",CFile::modeRead);
    char  bVal[100000];//定义长度为100k
    UINT uIsRead=0;//已经读取 //定义变量
    VARIANT varChunk;
    SAFEARRAY *psa;//一个封装数组的东西的指针
    SAFEARRAYBOUND rgsabound[1];//一个结构体
    //创建SafeArray描述符:
    uIsRead=f.Read(bVal,100000);// f.Close();//关文件 rgsabound[0].cElements =uIsRead;
    rgsabound[0].lLbound = 0;
    psa = SafeArrayCreate(VT_UI1,1,rgsabound);//建立SAFEARRAY //放置数据元素到SafeArray:
    for(long index=0;index<uIsRead;index++)          
    {
    if(FAILED(SafeArrayPutElement(psa,&index,&bVal[index])))
    ::MessageBox(NULL,"出毛病了。","提示",MB_OK | MB_ICONWARNING);
    }
    //一个一个地放,挺麻烦的。
    //封装到VARIANT内:
    varChunk.vt = VT_ARRAY|VT_UI1;
    varChunk.parray = psa;

    // Create Command Object
    Cmd1.CreateInstance( __uuidof( Command ) );
    Cmd1->ActiveConnection = m_CADODB.GetActiveConnection();
    Cmd1->CommandText  = _bstr_t("testdatebase ?"); Param1 = Cmd1->CreateParameter( _bstr_t(""),
    adVarBinary,
    adParamInput,
    -1,
    varChunk);
    Param1->Value = varChunk;
    Cmd1->Parameters->Append( Param1 );
    Rs1 = Cmd1->Execute(NULL,NULL,NULL);


    //取得文件大小
    CFile f2;
    f2.Open("c:\\bbb.jpg",CFile::modeWrite|CFile::modeCreate);//建立文件
    long lPhotoSize = Rs1->Fields->Item["pic"]->ActualSize;  
    long lIsRead=0;

    _variant_t varChunk2;
    BYTE buf[100000];
    while(lPhotoSize>0)
    {
    lIsRead=lPhotoSize;
    varChunk2 = Rs1->Fields->Item["pic"]->GetChunk(lIsRead);
    for(long index=0;index<lIsRead;index++)         
    {           
    ::SafeArrayGetElement(varChunk2.parray,&index,buf+index);   
    }
    f2.Write(buf,lIsRead);
    lPhotoSize-=lIsRead;
    }
    f2.Close();



    }
      

  3.   

    我给你一个我自己的代码
    BOOL CADORecordset::AppendChunk(FieldPtr pField, LPVOID lpData, UINT nBytes)
    {
    HRESULT hr;
    _variant_t varChunk;
    long lngOffset = 0;
    UCHAR chData;
    SAFEARRAY FAR *psa = NULL;
    SAFEARRAYBOUND rgsabound[1]; try
    {
    // Create a safe array to store the array of BYTES 
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = nBytes;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound); while (lngOffset < (long)nBytes)
    {
    chData = ((UCHAR*)lpData)[lngOffset];
    hr = SafeArrayPutElement(psa, &lngOffset, &chData); if (FAILED(hr)) return FALSE;

    lngOffset++;
    }
    lngOffset = 0; // Assign the Safe array  to a variant. 
    varChunk.vt = VT_ARRAY|VT_UI1;
    varChunk.parray = psa; hr = pField->AppendChunk(varChunk); if (SUCCEEDED(hr)) return TRUE;
    }
    catch (_com_error &e)
    {
    dump_com_error(e);
    return FALSE;
    } return FALSE;
    }调用
    UINT nRet = 0;
    CADORecordset  adoSetImage;
    CADOFieldInfo *fldinfo = new CADOFieldInfo; CFile file;
    BYTE *data;
    long size; if (!file.Open(m_strFile, CFile::modeRead|CFile::typeBinary))
    {
    MessageBox("读取图象数据失败!", "信息...", MB_OK|MB_ICONERROR);
    nRet = 1;
    }
    else
    {
    adoSetImage = CADORecordset(m_pChildFrame->m_pAdoCon);
    if (adoSetImage.Open("ADmain..RECimage"))
    {
    size = 1024;
    adoSetImage.AddNew();
    data = new BYTE[size + 1];
    adoSetImage.SetFieldValue("prj_id", atol(m_strPrjRecNo));
    adoSetImage.SetFieldValue("room_id", atol(m_strRecNo));
    DWORD dwLength = file.GetLength();
    while (file.Read(data, size))
    {
    adoSetImage.AppendChunk("f_image", (LPVOID)data, size);
    dwLength -= (DWORD)size;
    if (dwLength < (DWORD)size) size = (UINT)dwLength;
    }
    adoSetImage.Update(); delete data;
    }
    else
    {
    MessageBox(adoSetImage.GetLastErrorStr(), "信息...", MB_OK|MB_ICONERROR);
    nRet = 1;
    }
    } delete fldinfo;