通行证: 用户 密码 域名空间  下载中心 社区论坛 信息公告 MY小屋
联系我们
设为首页
加入收藏

 

QQ,ASP,PHP,JSP,XML,SQL,.Net,编程 程序 网页图象 建站经验 私服
首页 | 新闻资讯 | 编程开发 | 网页设计 | 图形图象 | 网络媒体 | 网站模板 | 数 据 库 | 投稿
论坛 | 操作系统 | 系统优化 | 网络安全 | 黑客技术 | 硬件学堂 | 硬件报价 | 服 务 器 | 地图
专题 | 应用软件 | 聊天通讯 | Q Q 专栏 | 建站经验 | 在线工具 | 站长Club | 注 册 表 | 旧版
社会 | 游戏娱乐 | 设计欣赏 | 疑难解答 | 社区论坛 | 韩国素材 | 素材图库 | 广告服务 | 服务
当前位置:首页>>编程开发>>C#语言>>正文 新版上线![旧版]
注:打开慢时请稍等

VC编程中如何操作数据库中的图像字段

http://www.iyit.net  日期:2006-7-18 22:56:08  来源:Internet  点击:
参加讨论
  本文以ACESS97为例,采用ODBC方式打开数据库Photo,数据库Photo的images表中含有一个image的图像字段,在刚打开时显示第一条记录。存取操作时关键是确定数据的长度,读数据操作时图像数据可以从记录集的图像字段对应的长二进制成员变量m_Image的成员m_hData得到,这个句柄变量存放分配给图像字段的数据,该对象的另一个成员变量m_dwDataLength为该字段的实际长度,在某些情况下,m_dwDataLength的值有可能小于m_hData中的数据长度值。具体内容可以参考MSND。以下实现的部分关键代码。首先请看 CdbImages记录集的定义:

CdbImages::CdbImages(CDatabase* pdb)
: CRecordset(pdb)
{
//{{AFX_FIELD_INIT(CdbImages)
m_nFields = 2;//数据库中有两个字段
//}}AFX_FIELD_INIT
m_nDefaultType = snapshot;//数据库以快照形式打开
}
CString CdbImages::GetDefaultConnect()
{
return _T("ODBC;DSN=MS Access Database");//以ODBC操作数据库
}
CString CdbImages::GetDefaultSQL()
{
return _T("[Images]");//默认的操作是连接到数据库中的Images表
}
void CdbImages::DoFieldExchange(CFieldExchange* pFX)
{
//{{AFX_FIELD_MAP(CdbImages)
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_LongBinary(pFX, _T("[Image]"), m_Image);//记录集中的成员对象和表中的OLE字段采用长二进制交换。
//}}AFX_FIELD_MAP
}
///////////////////////////////////////////////////////////
//从数据库中显示图像数据
CDatabase m_DB;//定义的数据库全局变量
CBitmap Bitmap;//定义的图像类全局变量,用以存储图像数据
void CImageView::OnOpenDateBase()
{
m_DB.Open(NULL, //以ODBC形式打开数据库
FALSE,
FALSE,
"ODBC;DRIVER={
Microsof Access Driver (*.mdb)};DBQ=Photo.mdb");
CdbImages dbImages(m_DB);
CString strFileName ;// 用来存放临时文件名,以该临时文件存放读取的数据库的图像数据。
i=1;//I为临时文件号
StrFileName.Format("%s",i)
dbImages.Open();
if (dbImages.IsEOF())
AfxMessageBox("Unable to get image from db");
else
{
char tmpPath[_MAX_PATH+1];
GetTempPath(_MAX_PATH,tmpPath);//得到临时文件的目录;
strFileName.Insert(0,tmpPath);//生成临时文件名
CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);
//向临时文件写数据,数据库中数据读操作时关键是知道数据的长度,这可以从记录集的图像字段对应的长二进制成员变量m_Image的成员dwDataLength得到;
LPSTR buffer = (LPSTR)GlobalLock(dbImages.m_Image.m_hData);
outFile.WriteHuge(buffer,dbImages.m_Image.m_dwDataLength);
GlobalUnlock(dbImages.m_Image.m_hData);
outFile.Close();
//定义图像句柄;
HBITMAP hbm = (HBITMAP)::LoadImage(NULL,
strFileName,
IMAGE_BITMAP,
0,
0,
LR_LOADFROMFILE);

if (Bitmap.Attach(hbm))//将图像句柄和Cbitmap对象联系起来
{
BITMAP bm;
Bitmap.GetBitmap(&bm);//获取图像尺寸
Bitmap.SetBitmapDimension(bm.bmWidth,bm.bmHeight);
return;
}
Invalidate();//重画屏幕
}
/////////////////////////////////////////////
void CImageView::OnDraw(CDC* pDC)//显示图像
{
CDC memDC;
memDC.CreateCompatibleDC(pDC);
CBitmap* pImage = memDC.SelectObject(Bitmap);
CSize imageSize = Bitmap.GetBitmapDimension();
pDC->BitBlt(0,0,imageSize.cx,imageSize.cy,&memDC,0,0,SRCCOPY);
memDC.SelectObject(pImage);
}
//////////////////////////////////////////////////////
//以下是向数据中添加图像记录
void CImageView::OnSaveDateBase()
{//打开图像文件
static char BASED_CODE szFilter[] = "Bitmap Files (*.bmp)|*.bmp||";
CdbImages dbImages(m_DB);
CFileDialog fd(TRUE,NULL,NULL,0,szFilter,this);
if (IDOK != fd.DoModal())
return;
dbImages.Open();//打开数据库
dbImages.AddNew();//添加新的记录
CFile fileImage;
CFileStatus fileStatus;
fileImage.Open(fd.GetPathName(), CFile::modeRead);
fileImage.GetStatus(fileStatus);//得到打开的图像文件的状态信息;
dbImages.m_Image.m_dwDataLength = fileStatus.m_size;
HGLOBAL hGlobal= GlobalAlloc(GPTR,fileStatus.m_size);//申请存放图像数据的空间。
dbImages.m_Image.m_hData = GlobalLock(hGlobal);//将该空间付给m_hData成员;
//向缓冲区读图像数据
fileImage.ReadHuge(dbImages.m_Image.m_hData,fileStatus.m_size);//向m_Image读图像数据。
dbImages.SetFieldDirty(&dbImages.m_Image);//标志数据库已经修改;
dbImages.SetFieldNull(&dbImages.m_Image,FALSE);//设置记录为NULL;
dbImages.Update();//刷新数据库的记录
GlobalUnlock(hGlobal);
dbImages.Close();

}


  上述代码在VC6.0,windows98下编译通过,运行正常,有兴趣的朋友可以稍加修改,将文中所述的功能添加到自己的应用程序当中去。



编辑:黑鹰 [发送给好友] [打印本页] [关闭窗口] [返回顶部]
上一篇:Windows 9X硬件中断设备驱动程序的开发
下一篇:WDM驱动程序设计之编译安装篇
转载请注明来源:www.iyit.net
特别声明: 本站除部分特别声明禁止转载的专稿外的其他文章可以自由转载,但请务必注明出处和原始作者。文章版权归文章原始作者所有。对于被本站转载文章的个人和网站,我们表示深深的谢意。如果本站转载的文章有版权问题请联系编辑人员,我们尽快予以更正。

 相关文章
VC++ SMTP协议电子邮件传送剖析 VC的另类数据库编程 VC打造自己特色的屏幕保护
在VC++下对文件属性的获取与更改 VC++6.0中控制运行唯一实例 VC编程中如何操作数据库中的图像字段
用VC进行COM编程所必须掌握的理论知识 用VC进行COM编程所必须掌握的理论知识 VC# .Net中浏览Crystal Report
VC++ SMTP协议电子邮件传送剖析 VC的另类数据库编程 VC打造自己特色的屏幕保护
在VC++下对文件属性的获取与更改 VC++6.0中控制运行唯一实例 用VC进行COM编程所必须掌握的理论知识
用VC进行COM编程所必须掌握的理论知识 VC# .Net中浏览Crystal Report VC++ SMTP协议电子邮件传送剖析
VC的另类数据库编程 在VC++中访问和修改系统注册表 ASP.NET下MVC设计模式的实现
PHP.MVC的模板标签系统(一) PHP.MVC的模板标签系统(二) PHP.MVC的模板标签系统(三)
最新更新 热点排行 推荐新闻
VC++ SMTP协议电子邮件传送剖析
Managed C++设计新邮件检查器
解决两个难懂的安全性问题
高级扫描技术及原理介绍
VC的另类数据库编程
VC++ SMTP协议电子邮件传送剖析
Managed C++设计新邮件检查器
解决两个难懂的安全性问题
高级扫描技术及原理介绍
VC的另类数据库编程
托盘编程全接触
在Visual C++中使用内联汇编
理解 Visual C++ Extensions for ADO
TCP/IP Winsock编程要点
VC打造自己特色的屏幕保护
VC++ SMTP协议电子邮件传送剖析
Managed C++设计新邮件检查器
解决两个难懂的安全性问题
高级扫描技术及原理介绍
VC的另类数据库编程
编程解决注册表问题所需的函数详解
盛大龙与地下城1万人内测 双核用户先行
VB.NET注册表编程
体验Painter IX的新特性
Painter 8 教程:铅笔素描画
共享软件的十大破解工具推荐
在VB中使用注册表
韩国网站FLASH效果动画源码源文件
Fireworks轻松绘制banner广告
威金蠕虫肆虐互联网 中招用户数量过万
在ASP.net中保存/取出图片入/从SQL数据
一个.net 压缩位图至JPEG的代码
制服流氓:27种恶意软件安装卸载实录
不止上网 IE地址栏的妙用
入侵中国某大型商业网站服务器全记录
IRC波特病毒出变种 黑客可远程控制电脑
传AMD与ATI合并已谈妥 对中国影响不大
金山PK网易 网游核心开发人员相互跳槽
英特尔公开与AMD翻脸 “口水战”升级
共享软件的十大破解工具推荐
 友情链接
设置首 页 - 版权声明 - 广告服务 - 关于我们 - 联系我们 - 友情连接
Copyrights © 2004-2006 iYiT.Net All Rights Reserved.
网站合作、广告联系QQ:147007642、466949678
易特网络技术 点击这里给我发消息