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

2016-01-29 12:42 14 1 收藏

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

【 tulaoshi.com - C语言心得技巧 】

  本文以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(G

来源:https://www.tulaoshi.com/n/20160129/1487257.html

延伸阅读
一、 制作VB数据库访问ACTIVEX DLL 1、首先使用VB6.0创建一个心得ACTIVEX DLL工程,将工程命名为prjado、将类命名为clsado。 2、为工程添加ADO对象库的引用。工程->引用:Microsoft ActiveX Data Objects2.0 Library 3、为类增加两个新的变量: Dim con As New ADODB.Connection 定义ADO会话连接对象 Dim cmd As New A...
标签: SQLServer
  本章内容 SQL介绍 使用SELECT 语句从表中取数据 创建新表 字段属性 向表中添加数据 删除和修改表 为了建立交互站点,你需要使用数据库来存储来自访问者的信息。例如,你要建立一个职业介绍服务的站点,你就需要存储诸如个人简历,所感兴趣的工作等等这样的信息。创建动态网叶也需要使用数据库,如果你想显示符合来访者要求的...
标签: Java JAVA基础
1、java数据库操作基本流程 2、几个常用的重要技巧: 可滚动、更新的记录集 批量更新 事务处理 java数据库操作基本流程:取得数据库连接 - 执行sql语句 - 处理执行结果 - 释放数据库连接 1、取得数据库连接 1)用DriverManager取数据库连接 例子: String className,url,...
  /*******************************  * 功能:数据库操作相关  * 作者:FlashICP  * 时间:2005-7-22  * ******************************/ using System; using System.Data; using System.Data.SqlClient; using System.Web; namespace moban {  public class data  {   protected static strin...
标签: SQLServer
  本章内容 ■ 创建索引 ■ SQL核心语句 ■ 集合函数 ■ 其它常用的SQL表达式,函数,和过程 第十章“SQL基础”向你初步介绍了SQL。你学会了如何用SELECT语句进行查询,你还学会了如何建立自己的表。在这一章里,你将加深你的SQL知识。你将学习如何建立索引来加快查询速度。你还将学会如果用更多的SQL语句和函数来操作表中的数据...

经验教程

279

收藏

63
微博分享 QQ分享 QQ空间 手机页面 收藏网站 回到头部