⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 subject_29342.htm

📁 一些关于vc的问答
💻 HTM
字号:
<p>
序号:29342 发表者:金枪鱼 发表日期:2003-02-05 00:06:39
<br>主题:怎样将图形数据写入数据库?
<br>内容:我想把图形(比较小)数据写入数据库。<BR><BR>使用ACCESS,记录图形数据的字段为OLE对象类型。使用ODBC,记录集中分配这种字段的类型为CLongBinary。按照MSDN的说明,使用CLongBinary类的两个成员数据来操作这个字段。<BR><BR>我已经将图形转入全局内存,其句柄为hMyGlobal,大小为dwImageSIze,这两个数据在其它的使用(如显示等)操作中正常。<BR>但我在<BR><BR>打开数据库.....<BR>打开记录集.....<BR>pRs-AddNew();<BR>.......<BR>pRs-&gt;m_Image.m_dwDataLength=dwImageSize;<BR>pRs-&gt;m_Image.m_hData=hMyGlobal;<BR>.......<BR><BR>虽然编译正确,程序运行正常,其它类型的数据写入也正常,但始终没有把图形二进制数据写入到数据库的m_Image字段中。打开ACCESS查看,这个字段仍然是空!!!<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>
回复者:tjhe 回复日期:2003-02-05 00:24:34
<br>内容:pRs-&gt;m_Image.m_dwDataLength=dwImageSize;<BR>pRs-&gt;m_Image.m_hData=hMyGlobal;<BR><BR>pRs-&gt;SetFieldDirty(&amp;pRs-&gt;m_Image);<BR>pRs-&gt;SetFieldNull(&amp;pRs-&gt;m_Image,FALSE);<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-02-05 21:35:52
<br>内容:谢谢tjhe的指点。<BR>通过pRs-&gt;SetFieldDirty()和pRs-&gt;SetFieldNull()好像已经将图形数据写入了数据库。<BR><BR>打开ACCESS查看,该字段数据显示为“二进制长数据”,但无法查看其具体内容。<BR><BR>我试图通过程序来提出数据库的图形记录,看图形是否为原来的图形。<BR>打开数据库<BR>打开记录集<BR><BR>if((pRs-&gt;m_Image.m_hData!=NULL)&amp;&amp;(pRs-&gt;m_Image.m_dwDataLength&gt;0))<BR>{<BR>dwImageSize=pRs-&gt;m_Image.m_dwDataLength;<BR>hMyGlobal=GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwImageSize);<BR>hMyGlobal=pRs-&gt;m_Image.m_hData;<BR>}<BR>else<BR>{<BR>dwImageSize=0;<BR>hMyGlobal=NULL;<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>回复者:tjhe 回复日期:2003-02-05 22:52:14
<br>内容:pRs-&gt;m_Image.m_dwDataLength=dwImageSize;<BR>pRs-&gt;m_Image.m_hData=hMyGlobal; //hMyGlobal是图形的全部数据还是??<BR><BR>pRs-&gt;SetFieldDirty(&amp;pRs-&gt;m_Image);<BR>pRs-&gt;SetFieldNull(&amp;pRs-&gt;m_Image,FALSE);<BR><BR><BR>if((pRs-&gt;m_Image.m_hData!=NULL)&amp;&amp;(pRs-&gt;m_Image.m_dwDataLength&gt;0))<BR>{<BR>dwImageSize=pRs-&gt;m_Image.m_dwDataLength;<BR>hMyGlobal=GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,dwImageSize);&nbsp;&nbsp;//得到的是句柄<BR>hMyGlobal=pRs-&gt;m_Image.m_hData;&nbsp;&nbsp;//刚分配的内存已遗失,造成泄漏<BR>}<BR><BR><BR>如果pRs-&gt;m_Image.m_hData代表图形全部数据,可先写到文件中试试:<BR>CFile picFile(图形文件名,CFile::modeCreate|CFile::modeReadWrite); //图形文件名自定<BR>LPBYTE buf = (LPBYTE)::GlobalLock(pRs-&gt;m_Image.m_hData);//<BR>picFile.WriteHuge(buf,pRs-&gt;m_Image.m_dwDataLength);&nbsp;&nbsp;<BR>GlobalUnlock(pRs-&gt;m_Image.m_hData);<BR>picFile.Close();<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-02-06 10:54:35
<br>内容:谢谢指点,按照你的方式写成了图形文件,其内容是正确的。<BR><BR>因此我想这里需要的解决两个HGLOBAL句柄内容之间的复制问题,即要将pRs-&gt;m_Image.m_hData的数据复制到hMyGlobal中去。锁定内存后该用什么函数来复制呢,memcpy行吗?<BR>另外要对比两个HGLOBAL句柄的内容是否相同,是不是应该在锁定内存后使用memcmp来对比?<BR><BR>这里先将分数奉上,请tjhe继续指点这个问题。<BR>另外,我们在平常使用ODBC的CRecordset类记录集对象进行数据库写入和更改操作时,并不需要显式地调用SetFieldDirty()和SetFieldNull()函数来标识这个记录字段的内容已经更改和已经不是空,为什么这里要这样,我不明白为什么?<BR><BR>2003-2-6 11:06:42

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -