Chinaunix首页 | 论坛 | 博客
  • 博客访问: 577855
  • 博文数量: 752
  • 博客积分: 40000
  • 博客等级: 大将
  • 技术积分: 5005
  • 用 户 组: 普通用户
  • 注册时间: 2008-10-13 14:47
文章分类

全部博文(752)

文章存档

2011年(1)

2008年(751)

我的朋友

分类:

2008-10-13 16:55:30

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



网上好象这个例子还没有样,如果你用VC做一个人事部管理系统,不可能没有人员照片吧!能找到的例子中都是用BMP,不敢用!
这个例子用到了VC6.0和access2002(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) );//显示出来看看
	} 

}
.......
完整的例子中有较多的中文说明,对你有用吗!?,有什么不妥之处请高手指教.
--------------------next---------------------

图片在对话框中的显示效果不好!
重绘做的不好!! ( wzh19831221 发表于 2007-12-16 18:42:00)
 
不必这么罗嗦
( rensheng 发表于 2006-3-17 23:51:00)
 
各位老兄,好象在图片重画方面,也就是刷新方面有问题啊
谁会解决请烦劳告知小弟一声哦
garycl@sina.com.cn

不胜感激!! ( 法兰西 发表于 2003-10-15 17:18:00)
 
很不错

刚好用到:) ( gerysand 发表于 2003-8-20 10:31:00)
 
如果再加个滚动条就好了 ( nj_adam 发表于 2003-6-27 21:59:00)
 
好像刷新存在点问题. ( pkjeff 发表于 2003-6-22 16:09:00)
 
没有哈,我是primer.......... ( ot512 发表于 2003-6-22 14:47:00)
 
"本文适合中级读者"  呵呵,看来我也入门了。。。
我找了好久都没找到一个jpg的例子。才自己乱做了一个,结果可以用。没有做检查和优化就发了,只为了说明这个方法。 ( ot512 发表于 2003-6-22 14:45:00)
 
注意new时判断是否成功
总的来说这段代码没有什么,以前的代码都刊登过了,不知道作者是否使用过odbc api操作图形文件和数据库,如果有的请说说 ( zfive5 发表于 2003-6-22 12:50:00)
 
.......................................................

--------------------next---------------------

阅读(467) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~