📄 subject_48192.htm
字号:
<p>
序号:48192 发表者:-=风=- 发表日期:2003-07-29 10:48:38
<br>主题:请高手指教3
<br>内容:各位高手!<BR><BR>我想用VC作一个程想完成如下操作<BR>1、把图片存在数据库中(SQL)!<BR>2、查询后再打开!<BR><BR>请那位高手指点一二!<BR><BR>我现在不知道在SQL中存图片应用那个类型!在程序中如何实现!<BR><BR>这里先谢了!<BR><BR>
<br><a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p>
<hr size=1>
<blockquote><p>
回复者:金鱼王 回复日期:2003-07-30 08:27:02
<br>内容:别这样,数据库会崩溃的。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:zbf 回复日期:2003-07-30 08:48:01
<br>内容:用2进制保存
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:-=风=- 回复日期:2003-07-30 09:04:11
<br>内容:金鱼王:<BR><BR>首先对你的指点表示感谢!<BR><BR>请教:我想作的是一个管理系统,里面要用到位图的存放和读取,如果是你,你会把它存在什么<BR><BR>地方呢?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:-=风=- 回复日期:2003-07-30 09:07:40
<br>内容:zbf:<BR><BR>非常感谢你的指点!<BR><BR>不过,我在VC中如何操作,如:添加记录(位图)、读取已有的位图、打印已有的位图呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:风之文章 回复日期:2003-07-30 09:20:01
<br>内容:VC编程中如何操作数据库中的图像字段 <BR> <BR>2002-07-23· ·刘 涛··yesky<BR><BR> <BR><BR> 在VC进行数据库编程中对图像的处理一直是个难点,经常有朋友为如何向数据库中添加图像或从数据库中读取图像数据并显示处理等问题所困扰,目前关于VC数据库编程的图书不少,但很少有涉及图象问题的,本文针对这一现状,介绍了如何解决上述的问题,希望可以对朋友们有所帮助。<BR><BR> 本文以ACESS97为例,采用ODBC方式打开数据库Photo,数据库Photo的images表中含有一个image的图像字段,在刚打开时显示第一条记录。存取操作时关键是确定数据的长度,读数据操作时图像数据可以从记录集的图像字段对应的长二进制成员变量m_Image的成员m_hData得到,这个句柄变量存放分配给图像字段的数据,该对象的另一个成员变量m_dwDataLength为该字段的实际长度,在某些情况下,m_dwDataLength的值有可能小于m_hData中的数据长度值。具体内容可以参考MSND。以下实现的部分关键代码。首先请看 CdbImages记录集的定义:<BR><BR>CdbImages::CdbImages(CDatabase* pdb)<BR>: CRecordset(pdb)<BR>{<BR>//{{AFX_FIELD_INIT(CdbImages)<BR>m_nFields = 2;//数据库中有两个字段<BR>//}}AFX_FIELD_INIT<BR>m_nDefaultType = snapshot;//数据库以快照形式打开<BR>}<BR>CString CdbImages::GetDefaultConnect()<BR>{<BR>return _T("ODBC;DSN=MS Access Database");//以ODBC操作数据库<BR>}<BR>CString CdbImages::GetDefaultSQL()<BR>{<BR>return _T("[Images]");//默认的操作是连接到数据库中的Images表<BR>} <BR>void CdbImages::DoFieldExchange(CFieldExchange* pFX)<BR>{<BR>//{{AFX_FIELD_MAP(CdbImages)<BR>pFX->SetFieldType(CFieldExchange::outputColumn);<BR>RFX_LongBinary(pFX, _T("[Image]"), m_Image);//记录集中的成员对象和表中的OLE字段采用长二进制交换。<BR>//}}AFX_FIELD_MAP<BR>}<BR>///////////////////////////////////////////////////////////<BR>//从数据库中显示图像数据<BR>CDatabase m_DB;//定义的数据库全局变量<BR>CBitmap Bitmap;//定义的图像类全局变量,用以存储图像数据<BR>void CImageView::OnOpenDateBase() <BR>{<BR>m_DB.Open(NULL, //以ODBC形式打开数据库<BR>FALSE,<BR>FALSE,<BR>"ODBC;DRIVER={<BR>Microsof Access Driver (*.mdb)};DBQ=Photo.mdb");<BR>CdbImages dbImages(m_DB);<BR>CString strFileName ;// 用来存放临时文件名,以该临时文件存放读取的数据库的图像数据。<BR>i=1;//I为临时文件号<BR>StrFileName.Format("%s",i)<BR>dbImages.Open();<BR>if (dbImages.IsEOF())<BR>AfxMessageBox("Unable to get image from db");<BR>else<BR>{<BR>char tmpPath[_MAX_PATH+1];<BR>GetTempPath(_MAX_PATH,tmpPath);//得到临时文件的目录;<BR>strFileName.Insert(0,tmpPath);//生成临时文件名<BR>CFile outFile(strFileName,CFile::modeCreate|CFile::modeWrite);<BR>//向临时文件写数据,数据库中数据读操作时关键是知道数据的长度,这可以从记录集的图像字段对应的长二进制成员变量m_Image的成员dwDataLength得到;<BR>LPSTR buffer = (LPSTR)GlobalLock(dbImages.m_Image.m_hData);<BR>outFile.WriteHuge(buffer,dbImages.m_Image.m_dwDataLength);<BR>GlobalUnlock(dbImages.m_Image.m_hData);<BR>outFile.Close();<BR>//定义图像句柄;<BR>HBITMAP hbm = (HBITMAP)::LoadImage(NULL,<BR>strFileName,<BR>IMAGE_BITMAP,<BR>0,<BR>0,<BR>LR_LOADFROMFILE);<BR><BR>if (Bitmap.Attach(hbm))//将图像句柄和Cbitmap对象联系起来<BR>{<BR>BITMAP bm;<BR>Bitmap.GetBitmap(&bm);//获取图像尺寸<BR>Bitmap.SetBitmapDimension(bm.bmWidth,bm.bmHeight);<BR>return;<BR>}<BR>Invalidate();//重画屏幕<BR>}<BR>/////////////////////////////////////////////<BR>void CImageView::OnDraw(CDC* pDC)//显示图像<BR>{<BR>CDC memDC;<BR>memDC.CreateCompatibleDC(pDC);<BR>CBitmap* pImage = memDC.SelectObject(Bitmap);<BR>CSize imageSize = Bitmap.GetBitmapDimension();<BR>pDC->BitBlt(0,0,imageSize.cx,imageSize.cy,&memDC,0,0,SRCCOPY);<BR>memDC.SelectObject(pImage);<BR>}<BR>//////////////////////////////////////////////////////<BR>//以下是向数据中添加图像记录<BR>void CImageView::OnSaveDateBase()<BR>{//打开图像文件<BR>static char BASED_CODE szFilter[] = "Bitmap Files (*.bmp)|*.bmp||";<BR>CdbImages dbImages(m_DB);<BR>CFileDialog fd(TRUE,NULL,NULL,0,szFilter,this);<BR>if (IDOK != fd.DoModal())<BR>return;<BR>dbImages.Open();//打开数据库<BR>dbImages.AddNew();//添加新的记录<BR>CFile fileImage;<BR>CFileStatus fileStatus;<BR>fileImage.Open(fd.GetPathName(), CFile::modeRead);<BR>fileImage.GetStatus(fileStatus);//得到打开的图像文件的状态信息;<BR>dbImages.m_Image.m_dwDataLength = fileStatus.m_size;<BR>HGLOBAL hGlobal= GlobalAlloc(GPTR,fileStatus.m_size);//申请存放图像数据的空间。<BR>dbImages.m_Image.m_hData = GlobalLock(hGlobal);//将该空间付给m_hData成员;<BR>//向缓冲区读图像数据<BR>fileImage.ReadHuge(dbImages.m_Image.m_hData,fileStatus.m_size);//向m_Image读图像数据。<BR>dbImages.SetFieldDirty(&dbImages.m_Image);//标志数据库已经修改;<BR>dbImages.SetFieldNull(&dbImages.m_Image,FALSE);//设置记录为NULL;<BR>dbImages.Update();//刷新数据库的记录<BR>GlobalUnlock(hGlobal);<BR>dbImages.Close();<BR><BR>} <BR> <BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:金鱼王 回复日期:2003-07-30 14:26:03
<br>内容:只是保存图片的路径,如果你一定要保存到数据库中,就用2进制
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-30 15:34:08
<br>内容:我做的数据库就是保存路径的,不过将图片放在数据库中也没什么,毕竟做数据库的人已经考虑到你要存很多的。只是我觉得不放心,就只存路径了!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:-=风=- 回复日期:2003-07-30 17:57:55
<br>内容:风之文章:<BR><BR>非常感谢!我先看看!<BR><BR>金鱼王\米罗:<BR><BR>请问两位保存路径又怎么做呢?
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:米罗 回复日期:2003-07-30 22:16:51
<br>内容:你可以加个字段用于保存路径。<BR>待要显示时,判断是否为空,来进行相应的处理。
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:-=风=- 回复日期:2003-08-07 15:21:07
<br>内容:米罗 :<BR><BR>能举个例子吗?<BR>
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
回复者:-=风=- 回复日期:2003-08-11 09:15:16
<br>内容:米罗 :<BR><BR>能举个例子吗?<BR><BR>我不知道用那个函数打开文件!
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
<hr size=1>
<blockquote><p>
<font color=red>答案被接受</font><br>回复者:米罗 回复日期:2003-08-11 10:28:26
<br>内容:你可以用fopen来操作,也可以用CFile类来处理!<BR>CFile myfile( "11.dat",CFile::modeWrite|CFile::modeCreate);<BR>或是<BR>FILE *p;<BR>fp=fopen(name,"r");<BR>再具体的请差MSDN
<br>
<a href="javascript:history.go(-1)">返回上页</a><br><a href=http://www.copathway.com/cndevforum/>访问论坛</a></p></blockquote>
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -