VC++6.0,SQL SERVER,ODBC,连接数据库存入、读取image类型的数据。 要求:从一个文件夹img中存入、读取 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 从文件读可以用CFileDialog dlg;CString path;if(dlg.DoModal()==IDOK) path = dlg.GetFilePah();后面的参考VC编程中如何操作数据库中的图像字段 2002-07-23· ·刘 涛··yesky 在VC进行数据库编程中对图像的处理一直是个难点,经常有朋友为如何向数据库中添加图像或从数据库中读取图像数据并显示处理等问题所困扰,目前关于VC数据库编程的图书不少,但很少有涉及图象问题的,本文针对这一现状,介绍了如何解决上述的问题,希望可以对朋友们有所帮助。 本文以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_INITm_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下编译通过,运行正常,有兴趣的朋友可以稍加修改,将文中所述的功能添加到自己的应用程序当中去。 http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=18143 有没有采用ODBC方式连接SQL SERVER的例子啊!!急用。拜托~~~ CDatabase db;db.OpenEx(_T("DSN=Hotel;UID=YILING"));//Hotel是ODBC名字,YILING是用户明//db.OpenEx(NULL); 我可以把图片放进image类型的字段里,但是读取出来的还有问题,怎么才能把读取出来的图片放在Picture控件里呢!老大帮忙!拜托~~~~~ 越来越假了 CComeboBox类的自动构造问题 请教邮件高手:怎么可以得到WINDOWS通讯薄里组的信息 树控件中根目录是默认选中的,如何默认选中为二级目录? 如何在基于SDK程序窗口中创建按钮或子对话框? 为什么没有人回答呢?这个问题是太弱智了吗?进来看啊,说话都给分! yahoo导航条 是如何制作的? 怎样将一个char*型变量 转化成 定长的字符串,以"0"填充于字符串头部?? 如何使最大化按钮灰化 关于CString 如何更新CListBox控件的内容? 怎么删去CListCtrl中的一列的数据??
CFileDialog dlg;
CString path;
if(dlg.DoModal()==IDOK)
path = dlg.GetFilePah();
后面的参考
VC编程中如何操作数据库中的图像字段
2002-07-23· ·刘 涛··yesky 在VC进行数据库编程中对图像的处理一直是个难点,经常有朋友为如何向数据库中添加图像或从数据库中读取图像数据并显示处理等问题所困扰,目前关于VC数据库编程的图书不少,但很少有涉及图象问题的,本文针对这一现状,介绍了如何解决上述的问题,希望可以对朋友们有所帮助。 本文以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下编译通过,运行正常,有兴趣的朋友可以稍加修改,将文中所述的功能添加到自己的应用程序当中去。
急用。拜托~~~
db.OpenEx(_T("DSN=Hotel;UID=YILING"));//Hotel是ODBC名字,YILING是用户明
//db.OpenEx(NULL);
拜托~~~~~