如何将jpeg图片存入ACCESS数据库,急,急!

解决方案 »

  1.   

    #include <adoid.h>
    #include <adoint.h>
    #include <icrsint.h>
    #include <atlbase.h>
    ADOConnection* m_Conn;
    ADORecordset* m_Rec;
    //_RecordsetPtr m_Rec;
    ADOFields* pFields;
    ///////设置ADO COM接口
    const IID IID_IADOConnection = 
    {0x00000550,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
    const CLSID CLSID_CADOConnection = 
    {0x00000514,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
    const IID IID_IADORecordset = 
    {0x00000556,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
    const CLSID CLSID_CADORecordset = 
    {0x00000535,0x0000,0x0010,{0x80,0x00,0x00,0xAA,0x00,0x6D,0x2E,0xA4}};
    void COleadoDlg::OnOK() 
    {
    // TODO: Add extra validation here
    HRESULT   hr;
    DWORD FileSize,count;
    // LONG num;
    char *pBuf;
    VARIANT varBLOB;
    SAFEARRAY *psa;
    VARIANT rgvFields;
    VARIANT rgvValues;
    CFile f;
    CFileException e;
    HGLOBAL hfilemem; SAFEARRAYBOUND rgsabound[1];
    hr=CoInitialize(NULL);
    CString Constr,wCmdString,tempstr;
    CComPtr<ADOField> pField;
    if(FAILED(hr))
    m_Conn = NULL;
    m_Rec = NULL;
    pFields = NULL;
    if(!f.Open(m_PhotoPath,CFile::modeRead,&e))
    {
    AfxMessageBox("打开文件错误!");
    return;
    }
    f.SeekToBegin();
    FileSize=f.GetLength();
    hfilemem=GlobalAlloc(GMEM_MOVEABLE,(FileSize));
    if(!hfilemem)
    {
    ::AfxMessageBox("内存不够!");
    return;
    }
    pBuf=(char *)GlobalLock(hfilemem);
    count=f.Read(pBuf,FileSize);
    if(count!=FileSize)
    {
    ::AfxMessageBox("数据错误");
    f.Close(); 
    return;
    }
    f.Close();
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADOConnection,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADOConnection,(LPVOID*)&m_Conn);
    if (FAILED(hr))
    return ;
    hr = ::CoCreateInstance((REFCLSID)CLSID_CADORecordset,NULL,CLSCTX_INPROC_SERVER,\
    (REFIID)IID_IADORecordset,(LPVOID*)&m_Rec);
    if (FAILED(hr))
    return ;
    tempstr="E:\\练习\\MyApp\\数据库\\oleado\\oleado.mdb";
    Constr="Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+tempstr+";Persist Security Info=False";
    hr = m_Conn->Open(CComBSTR(Constr),CComBSTR(""),CComBSTR(""),adOpenUnspecified);
    if (FAILED(hr))
    {
    ::AfxMessageBox("连接数据库错误!");
    return ;
    }
    wCmdString=_T("select * from userphoto");//
    hr = m_Rec->Open(CComVariant(wCmdString),CComVariant(m_Conn),adOpenKeyset,adLockOptimistic,adCmdText);
    if (FAILED(hr))
    {
    ::AfxMessageBox("打开表错误!");
    return ;
    }/*     添加新的记录 需要两个参数 所以添加两个空的参数*/
    rgvFields.vt = VT_ERROR;
    rgvFields.scode = DISP_E_PARAMNOTFOUND;
    rgvValues.vt = VT_ERROR;
    rgvValues.scode = DISP_E_PARAMNOTFOUND;
    UpdateData(); 
    m_Rec->AddNew(rgvFields, rgvValues);
    m_Rec->put_Collect(CComVariant(1),(CComVariant)(m_UserName));
    m_Rec->put_Collect(CComVariant(2),CComVariant((long)m_UseOld));             ///为新记录填充username字段
    pField=NULL;
    if(pBuf)
    {    
    rgsabound[0].lLbound = 0;
    rgsabound[0].cElements = FileSize;
    psa = SafeArrayCreate(VT_UI1, 1, rgsabound);                      ///创建SAFEARRAY对象
    for (long i = 0; i < (long)FileSize; i++)
    SafeArrayPutElement (psa, &i, pBuf++);                         ///将pBuf指向的二进制数据保存到SAFEARRAY对象psa中
    varBLOB.vt = VT_ARRAY | VT_UI1;                                   ///将varBLOB的类型设置为BYTE类型的数组
    varBLOB.parray = psa;                                             ///为varBLOB变量赋值
    m_Rec->get_Fields(&pFields);//加入BLOB类型的数据
    pFields->get_Item(CComVariant(3),&pField);
    pField->AppendChunk(varBLOB);///加入BLOB类型的数据

    hr=m_Rec->Update(rgvFields, rgvValues);  
    if(FAILED(hr))
    {
    ::AfxMessageBox("保存失败!");
    return ;
    }
    // m_Rec->UpdateBatch(adAffectAll);
    GlobalUnlock(hfilemem);
    GlobalFree(hfilemem);
    if(m_Rec)
    {
    m_Rec->Release();
    }
    if(m_Conn)
    {
    m_Conn->Close();
    m_Conn->Release();
    }
    ::AfxMessageBox("个人资料保存成功"); 
    m_PhotoPath.Empty();
    m_UseOld=0;
    m_UserName.Empty();
    SetDlgItemText(IDC_USERNAME, (LPCTSTR)" "); //在编辑框1中显示文件名
    SetDlgItemInt(IDC_USEROLD,0);
    // UpdateData(TRUE); 
    // CDialog::OnOK();
    }