首页 > 数据库 > Access > 正文

用MFC + ADO 把jpg图象文件放入ACCESS库中

2020-03-24 18:36:12
字体:
来源:转载
供稿:网友
源码下载网上好象这个例子还没有样,如果你用VC做一个人事部管理系统,不可能没有人员照片吧!能找到的例子中都是用BMP,不敢用! 这个例子用到了VC6.0和access2002(html' target='_blank'>officeXP),涉及到ADO的用法,文件对话框的使用,一个CPicture类和一个buffer缓冲区。 一、我的ADO用法整理 1. stdafx.h头文件中加入:#import "c:/program files/common files/system/ado/msado15.dll" no_namespace rename("EOF","adoEOF")
2. 应用程序初始化中加入:AfxOleInit();
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection");///创建Connection对象
if(SUCCEEDED(hr))
{
hr = m_pConnection- Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=wy.mdb","","",adModeUnknown);///连接数据库
///上面一句中连接字串中的Provider是针对ACCESS2000环境的,对于ACCESS97,需要改为:Provider=Microsoft.Jet.OLEDB.3.51;
}
}
catch(_com_error e)///捕捉异常
{
CString errormessage;
errormessage.Format("打开 wy.mdb 数据库失败!/r/n错误信息:%s",e.ErrorMessage());
AfxMessageBox(errormessage);///显示错误信息
}
3. 应用程序EXIT中加入:if (m_pConnection- State)
m_pConnection- Close();
4. 应用程序中加入:_ConnectionPtr m_pConnection;
5. 对话框类中加入:_RecordsetPtr m_pRecordset;
6. 注意使用:extern CWYApp theApp;
7. 使用纪录集:try
{
m_pRecordset.CreateInstance("ADODB.Recordset");
m_pRecordset- Open("SELECT * FROM 客户 ORDER BY 客户id",
_variant_t((IDispatch*)theApp.m_pConnection,true),
adOpenStatic,adLockOptimistic,adCmdText);
}
catch(_com_error e)///捕捉异常
{
AfxMessageBox("读取数据库失败!");///显示错误信息
}
CPicture类(它能够显示JPG.GIF等等图片,详情请看CPicture.h头文件)
CPicture.h CPicture.cpp 二、流程图你一看便知: ADO作用在buffer内存和ACCESS2002数据库之间,而CPicture作用在buffer内存和显示窗口之间. 三、将jpg存入库并显示void COneDlg::OnButton1()
{
CFile f;
CString FilePathName;
CFileException e;
CFileDialog dlg(TRUE,NULL,NULL,0,"jpg Files (*.jpg)|*.jpg||",this);
if(dlg.DoModal()==IDOK)
{
FilePathName=dlg.GetPathName();
if(m_Pic.m_IPicture != NULL) m_Pic.FreePictureData(); // Important - Avoid Leaks...
if(f.Open(FilePathName, Cfile::modeRead | Cfile::typeBinary, e)) //打开了一个jpg文件
{
int nSize = f.GetLength(); //先得到jpg文件长度
BYTE * pBuffer = new BYTE [nSize]; //按文件的大小在堆上申请一块内存

if (f.Read(pBuffer, nSize) 0 ) //把jpg文件读到pBuffer(堆上申请一块内存)
{
BYTE *pBuf = pBuffer; ///下面这一大段是把pBuffer里的jpg数据放到库中
VARIANT varBLOB;
SAFEARRAY *psa;
SAFEARRAYBOUND rgsabound[1];

m_pRecordset- AddNew();

if(pBuf)
{
rgsabound[0].lLbound = 0;
rgsabound[0].cElements = nSize;
psa = SafeArrayCreate(VT_UI1, 1, rgsabound);
for (long i = 0; i (long)nSize; i++)
SafeArrayPutElement (psa, i, pBuf++);
varBLOB.vt = VT_ARRAY | VT_UI1;
varBLOB.parray = psa;
m_pRecordset- GetFields()- GetItem("j")- AppendChunk(varBLOB);
}
m_pRecordset- Update();

(m_Pic.LoadPictureData(pBuffer, nSize));//接作调用函数读pBuffer的jpg数据准备显示
delete [] pBuffer; //删掉堆上申请的那一块内存
pBuf=0; //以防二次乱用
}
f.Close();
}
CClientDC dc(this);
m_Pic.UpdateSizeOnDC( dc); // Get Picture Dimentions In Pixels
m_Pic.Show( dc, CRect(200,0,200+m_Pic.m_Width,m_Pic.m_Height) );//显示出来看看
}
}
.......
完整的例子中有较多的中文说明,对你有用吗!?,有什么不妥之处请高手指教
本文作者:html教程

郑重声明:本文版权归原作者所有,转载文章仅为传播更多信息之目的,如作者信息标记有误,请第一时间联系我们修改或删除,多谢。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表