CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  其他数据库开发 >  Sybase

ADO+Sybase : 从数据库中存取图片,ACCESS可以Sybase不行,我这段代码那里有错?

楼主pinel()2002-02-04 16:35:37 在 其他数据库开发 / Sybase 提问

////////////////////////////////////////  
  //读取图形  
  //////////////////////////////////////  
   
  int   CDBFun::QueryPic(CString   magiccard)  
  {  
  m_PicCount=0;  
  int   ret=0;  
   
                    _variant_t   varBLOB;  
  VariantInit   (&varBLOB);  
  CString   str;  
          try  
          {  
  str.Format("SELECT   sn,pic,patient_id   FROM   T_Pacs_Pic   WHERE   patient_id=\'%s\'",magiccard);  
   
  m_pRecordset->Open((_bstr_t)str,_variant_t((IDispatch*)m_pConnection,true),adOpenStatic,adLockOptimistic,adCmdText);  
   
  while(!m_pRecordset->adoEOF)  
  {  
  //read     data      
  long   lDataLength   =   m_pRecordset->Fields->GetItem("pic")->ActualSize;  
  varBLOB   =   m_pRecordset->GetFields()->GetItem("pic")->GetChunk(lDataLength);  
  if(varBLOB.vt   ==   (VT_ARRAY   |   VT_UI1))                  
  {  
  BYTE   *pBuf   =   NULL;        
  SafeArrayAccessData(varBLOB.parray,(void   **)&pBuf);    
  CString   strFileName   ;  
   
  strFileName.Format("%stmp%d.bmp",theApp.TEMP_PATHNAME,ret);  
   
  CFile   outFile;  
  outFile.Open(strFileName,CFile::modeCreate|CFile::modeWrite);  
  outFile.Write(pBuf,lDataLength);  
  outFile.Close();                        
   
  SafeArrayUnaccessData   (varBLOB.parray);  
  ret++;  
  }  
   
  m_pRecordset->MoveNext();  
   
  }  
   
                  m_pRecordset->Close();  
   
  }  
          catch(_com_error   &e)  
          {  
                  //   Notify   the   user   of   errors   if   any.  
                  _bstr_t   bstrSource(e.Source());  
                  _bstr_t   bstrDescription(e.Description());  
                  CString   sError;  
                  sError.Format("Source   :   %s   \n   Description   :   %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);  
                  AfxMessageBox(sError);            
  }    
   
  m_PicCount=ret;  
  return   ret;  
  }  
   
  ////////////////////////////////////////  
  //保存图形  
  //////////////////////////////////////  
   
  void   CDBFun::AddPic(CString   filename,CString   magiccard)  
  {  
  CFile   imagefile;  
  if(0   ==   imagefile.Open(filename,CFile::modeRead))  
  return;  
   
  _variant_t   vID,vPatientID,vSn;  
   
  BYTE*   pbuf;  
  long   nLength   =   imagefile.GetLength();  
  pbuf   =   new   BYTE[nLength+2];  
  if(pbuf   ==   NULL)  
  return;                                                          
  imagefile.Read(pbuf,nLength);                      
   
  SAFEARRAY*   psa;  
  SAFEARRAYBOUND   rgsabound[1];  
  rgsabound[0].lLbound   =   0;  
  rgsabound[0].cElements   =   nLength;  
  psa   =   SafeArrayCreate(VT_UI1,   1,   rgsabound);  
   
  for   (long   i   =   0;   i   <   nLength;   i++)  
  SafeArrayPutElement   (psa,   &i,   pbuf++);  
  VARIANT   varBLOB;  
  varBLOB.vt   =   VT_ARRAY   |   VT_UI1;  
  varBLOB.parray   =   psa;  
   
  try  
  {  
  m_pRecordset->Open("T_Pacs_Pic",_variant_t((IDispatch   *)   m_pConnection,true),adOpenKeyset,adLockOptimistic,adCmdTable);     //Open   a   Table  
   
  m_pRecordset->AddNew();      
   
  m_pRecordset->Fields->GetItem("pic")->AppendChunk(varBLOB);          
   
  vPatientID.vt=VT_BSTR;  
  vPatientID.bstrVal=magiccard.AllocSysString   (   )   ;  
   
  vSn.vt=VT_I2;  
  vSn.iVal=m_PicCount+1;  
   
  m_pRecordset->PutCollect("patient_id",vPatientID);  
  m_pRecordset->PutCollect("sn",vSn);  
   
  m_pRecordset->Update();  
  m_pRecordset->Close();  
   
  }  
  catch(_com_error   &e)  
  {  
  //   Notify   the   user   of   errors   if   any.  
  _bstr_t   bstrSource(e.Source());  
  _bstr_t   bstrDescription(e.Description());  
  CString   sError;  
  sError.Format("Source   :   %s   \n   Description   :   %s\n",(LPCSTR)bstrSource,(LPCSTR)bstrDescription);  
  AfxMessageBox(sError);            
  }  
   
   
   
  }  
   
  //////////////////////////////////////////  
  这段代码用于access时执行正确,连接到sybase读出来的图形数据老是4096字节,不知何故,头疼!高手搭救!!!  
  问题点数:100、回复次数:17Top

1 楼pinel()回复于 2002-02-04 17:27:47 得分 0

保存好像可以了,但是  
  long   lDataLength   =   m_pRecordset->Fields->GetItem("pic")->ActualSize;  
  读出的长度为4096,为什么????Top

2 楼pinel()回复于 2002-02-05 09:23:49 得分 0

Access的字段类型是ole对象,sybase类型是image,有什么区别?  
   
  自说自话很久了,有没有人答理一下Top

3 楼xiaowu_li(lixiaowu)回复于 2002-02-05 09:50:01 得分 20

这种方法是不是只能保存bmp格式的图片?Top

4 楼pinel()回复于 2002-02-05 13:12:27 得分 0

我保存的就是bmp,但是因为保存进去的是字节,我想不一定和格式有关,不一定是图片,可以是任何大字节的东西  
   
  有没有人做过sybase指教一下Top

5 楼pinel()回复于 2002-02-05 13:58:58 得分 0

?Top

6 楼pinel()回复于 2002-02-05 17:01:19 得分 0

 
                                                  送送送送  
                                                          送送送  
                                                              送送送  
                                                                  送送送  
                                              送送                 送送送  
                                              送送送                 送送送  
                                          送送送送                     送送送  
                                          送送送送                     送送送送  
                                      送送送送                             送送送送送  
                                  送送送送                                     送送送送送  
                                  送送送                                             送送送送送送  
                              送送送                                                     送送送送送送送送  
                          送送送                                     送送                 送送送送送送送送  
                      送送送                                 送送送送送送  
                  送送                     送送送送送送         送送送送  
          送送送         送送送送送送送送                 送送送送  
                                                  送送送送             送送送  
                                              送送送送                 送送送  
                                              送送送                     送送送  
                                          送送送送                     送送送  
                                      送送送送                     送送送送  
                                      送送送                         送送送  
                              送送送送                             送送送  
                          送送送                     送送     送送送送  
                      送送送                         送送送送送送  
              送送送                                     送送送送送  
                                                                  送送送  
  Top

7 楼uniware(uniware)回复于 2002-02-05 17:34:37 得分 20

 
  有的数据源不能立即返回长数据的精确长度,  
  因此建议你循环取数据GetChunk(),直到取出的长度为0为止  
  Top

8 楼pinel()回复于 2002-02-06 09:48:45 得分 0

试试  
  Top

9 楼whiskers(胡子)回复于 2002-02-06 10:06:53 得分 0

可以用READTEXT  
  USE   pubs  
  DECLARE   @val   varbinary(16)  
  SELECT   @val   =   textptr(pr_info)   FROM   pub_info  
  WHERE   pub_id   =   '0736'  
  READTEXT   pub_info.pr_info   @val   4   10  
   
       
  Top

10 楼pinel()回复于 2002-02-06 10:15:12 得分 0

有点门道Top

11 楼searoc(希拉克)回复于 2002-02-06 10:30:45 得分 20

请问你的PIC字段是什么类型的,我以前也出现过类似问题。  
  已经轻松解决,不知道你的问题和我的是否类似。  
  如果是的话,我把源码给你。  
  说说看看吧Top

12 楼pinel()回复于 2002-02-06 12:44:17 得分 0

searoc(夏雨) :谢谢  
  Access的字段类型是ole对象,sybase类型是image,  
  第一次碰到sybase,不知道是不是可以用binary类型  
   
  pinel@263.net  
  Top

13 楼whiskers(胡子)回复于 2002-02-07 11:11:59 得分 20

Sybase数据库的缺省值  
  将@@TEXTSIZE付值即可  
   
  Top

14 楼WindowsMe(美女免费)回复于 2002-02-08 17:59:34 得分 20

不可能吧  
   
  我也在sybase上用过,取actualsize是准确的  
   
  vb6+ado   2.1+sybase   ole   db   2.1+sybase   11.9  
   
  你用高版本ADO试试Top

15 楼pinel()回复于 2002-02-19 17:34:54 得分 0

我用15,高版本应该import什么?我没找到dll,是不是tlbTop

16 楼pinel()回复于 2002-02-19 22:49:47 得分 0

还没搞定,气晕了,  
  小于4096的图片是可以的,原来一次只能取出4096,怎么分段读取阿?  
   
  whiskers(胡子),你的readtext的语句通不过编译,@val   varbinary(16)是不是16字节的文件指针?readtext后面的4   10什么意思?从第四个字节开始往后读10个字节?为什么这么做?  
  @@TEXTSIZE缺省值是32768,不是4096阿  
   
  Top

17 楼pinel()回复于 2002-02-20 09:13:04 得分 0

将@@TEXTSIZE付值语句怎么写?Top

相关问题

  • 寻源代码(存取.ini文件)
  • ado如何存取excel?
  • 用ADO存取Excel文件
  • ADO问题!(代码)
  • 用asp在oracle里存取图片?最好有代码
  • 用asp在oracle里存取图片?最好有代码
  • 图片存取的代码出现问题,帮看一下:)
  • ado 操作出错代码
  • 谁知道JPEG图像文件的存取代码,能改压缩比的
  • 有vb存取图片到数据库的源代码吗?谢谢!!

关键词

  • sybase
  • 字段
  • ado
  • 数据
  • access
  • 送送
  • varblob
  • precordset
  • ldatalength
  • pic

得分解答快速导航

  • 帖主:pinel
  • xiaowu_li
  • uniware
  • searoc
  • whiskers
  • WindowsMe

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo