数据库字段:VC编制程序里面怎么样操作数据库里面地图像字段来源: 发布时间:星期四, 2009年2月12日 浏览:74次 评论:0
在VC进行数据库编程中对图像处理直是个难点经常有朋友为如何向数据库中添加图像或从数据库中读取图像数据并显示处理等问题所困扰目前有关VC数据库编程图书不少但很少有涉及图象问题本文针对这现状介绍了如何解决上述问题希望可以对朋友们有所帮助 本文以ACESS97为例采用ODBC方式打开数据库Photo数据库Photoimages表中含有个image图像字段在刚打开时显示第条记录存取操作时关键是确定数据长度读数据操作时图像数据可以从记录集图像字段对应长 2进制成员变量m_Image成员m_hData得到这个句柄变量存放分配给图像字段数据该对象另个成员变量m_dwDataLength为该字段实际长度在某些情况下m_dwDataLength值有可能小于m_hData中数据长度值具体内容可以参考MSND以下实现部分关键代码首先请看 CdbImages记录集定义: CdbImages::CdbImages(CDatabase* pdb) : CRecord(pdb) { //{{AFX_FIELD_IN99v(CdbImages) m_nFields = 2;//数据库中有两个字段 //}}AFX_FIELD_IN99v m_nDefaultType = snapshot;//数据库以快照形式打开 } CString CdbImages::GetDefaultConnect { _T(\"ODBC;DSN=MS Access Database\");//以ODBC操作数据库 } CString CdbImages::GetDefaultSQL { _T(\"[Images]\");//默认操作是连接到数据库中Images表 } void CdbImages::DoFieldExchange(CFieldExchange* pFX) { //{{AFX_FIELD_MAP(CdbImages) pFX->SetFieldType(CFieldExchange::outputColumn); RFX_LongBinary(pFX, _T(\"[Image]\"), m_Image);//记录集中成员对象和表中OLE字段采用长 2进制交换 //}}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; (dbImages.IsEOF) AfxMessageBox(\"Unable to get image from db\"); { char tmpPath[_MAX_PATH+1]; GetTempPath(_MAX_PATH,tmpPath);//得到临时文件目录; strFileName.Insert(0,tmpPath);//生成临时文件名 CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite); //向临时文件写数据数据库中数据读操作时关键是知道数据长度这可以从记录集图像字段对应长 2进制成员变量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; //定义图像句柄; HB99vMAP hbm = (HB99vMAP)::LoadImage(NULL, strFileName, IMAGE_B99vMAP, 0, 0, LR_LOADFROMFILE); (Bitmap.Attach(hbm))//将图像句柄和Cbitmap对象联系起来 { B99vMAP bm; Bitmap.GetBitmap(&bm);//获取图像尺寸 Bitmap.SetBitmapDimension(bm.bmWidth,bm.bmHeight); ; } 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 {//打开图像文件 char BASED_CODE szFilter = \"Bitmap Files (*.bmp)|*.bmp||\"; CdbImages dbImages(m_DB); CFileDialog fd(TRUE,NULL,NULL,0,szFilter,this); (IDOK != fd.DoModal) ; 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.0windows98下编译通过运行正常有兴趣朋友可以稍加修改将文中所述功能添加到自己应用当中去 0
相关文章读者评论发表评论 |
|