目前位置: VCer资源中心 >>> VCer开源 >>> 可重用类

[本帖已阅读2556次 分值140 回复6次] 张贴资源 发回信箱 控制面板

蓝风习作: VC中ADO 连接数据库保存显示JPG图象

提供者:bluewind 张贴时间:2007-10-14 13:10:18.0 出处:vcer.net 作者:不祥

蓝风习作: VC中ADO 连接数据库保存显示JPG图象(2007-10-14 13:10:18.0)


蓝风


 
级别: VCer小兵
头衔: VCer会员

经验: 453
作品: 5
分会: 华东分会
注册: 2007-10-13 15:01:34.0
登录: 2009-03-22 17:09:15.0
工程源码[6,123字节] 下载650
软件下载[2,164,933字节] 下载773

实现方法

void CRMSDlg::OnButton_in() //从库中提取并显示

{

    // TODO: Add your control notification handler code here

    try

    {

        // "pic" 是字段名,该字段保存着 OLE 对象

        long nSize = m_pRecordset->GetFields()->GetItem("pic")->ActualSize;    // 获取字段 "pic" 的当前单元的大小(在分配内存空间时要用到)   

        if(nSize > 0)

        {

            _variant_t varBLOB;

            varBLOB = m_pRecordset->GetFields()->GetItem("pic")->GetChunk(nSize);// 读取 OLE 对象 --> varBLOB

            if(varBLOB.vt == (VT_ARRAY | VT_UI1))

            {

                if(BYTE *pBuffer = new BYTE [nSize+1])        // 申请必要的存储空间

                {   

                    void* pBuf = NULL;

                    SafeArrayAccessData(varBLOB.parray,(void**)&pBuf);

                    memcpy(pBuffer,pBuf,nSize);                // 复制数据到缓冲区 pBuffer

                    SafeArrayUnaccessData (varBLOB.parray);

                    // SafeArrayAccessData() 的作用是给 varBLOB 分配一个 void 型指针

                    // 因为 memcpy 的第二个参数只接受 void 型指针

                    // 读取图像

                    if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData();

                    m_Pic.LoadPictureData(pBuffer, nSize);

                    delete [] pBuffer;

                    pBuf=0;

                   

                    // 显示图像

                    CStatic *pStaic;

                    pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);//指向图片将要要显示的区域

                  // memDC.CreateCompatibleDC(GetDC());

                    pStaic->GetClientRect(&rect);//得到指定区域

                    CClientDC dc(pStaic); //定义初始化设备变量

                    m_Pic.UpdateSizeOnDC(&dc); // Allocate memory for m_Pic

                    m_Pic.Show(&dc,CRect(0,0,188,190));

                   

                    OnButton_Fileout();       

                }

            }

        }

    }

    catch (_com_error e)

    {

    }

       

}

void CRMSDlg::OnButton_out() //存入库并显示

{

    // TODO: Add your control notification handler code here

    CFile f;

    CString  FilePathName;

    CFileException e;

   

    CFileDialog dlg(TRUE,NULL,NULL,0,"jpg Files (*.jpg)|*.jpg||",this); //TRUE为OPEN对话框,FALSE为SAVE AS对话框

    if(dlg.DoModal()==IDOK)

    {

        FilePathName=dlg.GetPathName();

        if(f.Open(FilePathName, CFile::modeRead | CFile::typeBinary, &e)) //打开指定的jpg文件

        {

            int nSize = f.GetLength();          //先得到 jpg 文件长度

            BYTE* pBuffer = new BYTE [nSize];  //按文件的大小在堆上申请一块内存 pBuffer

   

            if (f.Read(pBuffer, nSize) > 0 )    //把 jpg 文件读到 pBuffer

            {

                //把pBuffer里的jpg数据放到库中

                BYTE* pBuf = pBuffer;           

                VARIANT            varBLOB;       

                SAFEARRAY        *psa;

                SAFEARRAYBOUND    rgsabound[1];

               

            //    m_pRecordset->AddNew();            //添加一条新记录

                OnButton_File_In();//读入文件   

           

                if(pBuf)

                {   

                    rgsabound[0].lLbound = 0;

                    rgsabound[0].cElements = nSize;

                    psa = SafeArrayCreate(VT_UI1, 1, rgsabound); // 创建 SAFEARRAY 对象 psa

                    for (long i = 0; i < (long)nSize; i++)

                        SafeArrayPutElement (psa, &i, pBuf++);    // 将 bBuf 指向的二进制数据

                                                                // 保存到 psa 中

                    varBLOB.vt = VT_ARRAY | VT_UI1;    // 将 varBLOB 类型设为 BYTE 类型数组

                    varBLOB.parray = psa;            // 保存 psa 到 varBLOB

                   

                    m_pRecordset->GetFields()->GetItem("pic")->AppendChunk(varBLOB);//添加 varBLOB 到数据库

                }           

                // 更新数据库

                m_pRecordset->Update();

                // 读取图像

                if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData();

                m_Pic.LoadPictureData(pBuffer, nSize);

                delete [] pBuffer;

                pBuf=0;                //空指针指向0

            }

            f.Close();

           

        }

                 

        // 显示图像

                    CStatic *pStaic;

                    pStaic=(CStatic*)GetDlgItem(IDC_IMAGE);//指向图片将要要显示的区域

                  // memDC.CreateCompatibleDC(GetDC());

                    pStaic->GetClientRect(&rect);//得到指定区域

                    CClientDC dc(pStaic); //定义初始化设备变量

                    m_Pic.UpdateSizeOnDC(&dc); // Allocate memory for m_Pic

                    m_Pic.Show(&dc,CRect(0,0,188,190));

                    OnButton_Fileout();

    }   

}

待解决的BUG:查询不能正常进行,欢迎学习交流

注:转载文章需注明来源:VCer.net 文章地址:http://vcer.net/1192338618640.html

  如果你觉得VCer.net不错,而且你愿意为VCer.net捐赠一元钱,那么点击后面的捐赠按钮吧:) vcer.net捐赠

bluewind

[回复该贴] [加入个人书签]
[投票结果]

A: 评分 10 75% (6 票)
B: 评分 5 0% (0 票)
C: 评分 0 0% (0 票)
D: 评分 -5 0% (0 票)
E: 评分 -10 25% (2 票)

 


re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...谢谢,学习

qjwuqjwu 于 2009-04-24 12:36:46.0 编辑 [回复该贴]

re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...学习了

cemuestc 于 2009-03-26 00:27:02.0 编辑 [回复该贴]

re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...下载下来,好好学习下

xiaokarui 于 2008-12-30 11:36:36.0 编辑 [回复该贴]

re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...hhhhh

ziracle 于 2008-07-05 22:42:26.0 编辑 [回复该贴]

re:re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...so good

!

wangjiashuai 于 2008-07-15 09:29:43.0 编辑 [回复该贴]

re:re:re:蓝风习作: VC中ADO 连接数据库保存显示JPG图象

...CPictrue m_Pic?耶稣创造?

wangjiashuai 于 2008-07-15 09:55:09.0 编辑 [回复该贴]