CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  PowerBuilder >  数据库相关

再次散掉所有家当: 一个非常郁闷的问题!不知是不是PB的bug 请大家发表一下看法 !!

楼主ghostagain(心情卡片)2005-12-16 21:50:08 在 PowerBuilder / 数据库相关 提问

其实是个老问:   一个图片处理问题:  
   
  =============================================================  
  我上传脚本是  
  =========================================================  
  ///*   用大文本处理  
  long ll_row  
   
  ll_row   =   dw_1.getRow   ()  
  if   ll_row   <   0   then     return  
   
  gs_zh   =   dw_1.getItemString   (ll_row,   "幢号")  
  gs_dy   =   dw_1.getItemString   (ll_row,   "单元")  
  gs_lc   =   dw_1.getItemString   (ll_row,   "楼层")  
  ls_fh   =   dw_1.getItemString   (ll_row,   "房号")  
   
  String       ls_FileName,   ls_pathName,   ls_currDir  
  int     li_ret,   li_filePtr,   li_loops,   i  
  long ll_fileLen,   ll_bytes_read,   ll_new_pos  
  blob lbb_read,   lbb_total  
   
  ls_currDir   =   getCurrentDirectory   ()     //当前路径      
   
   
  li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename,   "jpg",   &  
      "JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp"     )  
  changeDirectory   (ls_currDir)  
   
  IF   Li_ret   <=   0   then   return    
  //messageBox   ('',   '')  
  setPointer   (hourGlass!)  
  li_filePtr   =   fileOpen   (ls_pathName,   STREAMMODE!,   READ!,   Shared!)  
  if   li_filePtr   <>   1   then  
  messageBox   ("错误",   "打开图形文件失败!",   stopSign!)  
  return  
  end   if  
   
  ll_fileLen   =   fileLength   (ls_pathname)  
  if   ll_fileLen   >   32766   then  
  li_loops   =   long   ((ll_fileLen   -   1)/32766)   +   1  
  else  
  li_loops   =   1  
  end   if  
  messageBox   (string   (ll_fileLen)   ,   string   (li_loops)   )  
  for   i   =   1   to   li_loops   step   1  
  ll_bytes_read   =   fileRead   (li_filePtr,   lbb_read)  
  lbb_total   =   lbb_total   +   lbb_read  
  ll_new_pos   =   ll_new_pos   +   ll_bytes_read  
  fileSeek   (li_filePtr,   ll_new_pos,   FROMBEGINNING!)  
  next  
  FileClose   (li_filePtr)  
   
  sqlca.autocommit   =   true  
  UPDATEBLOB 楼盘信息  
  SET 户型图   =   :lbb_total  
  WHERE   幢号   =   :gs_zh   AND  
  单元   =   :gs_dy   AND  
  楼层   =   :gs_lc   AND  
  房号   =   :ls_fh  
  USING   SQLCA;  
  if   SQLCA.SQLCode   =   0   then    
  commit   using   sqlca;  
  messageBox   ("提示",   "保存图片成功!")  
  else  
  rollback   using   sqlca;  
  messageBox   ("数据库错误",   "保存图片失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  end   if  
  sqlca.autocommit   =   false  
   
  =============================================================  
  读图片的脚本是:  
  ==============================================================  
  /*   用大文本处理*/  
  long ll_row  
   
  ll_row   =   dw_1.getRow   ()  
  if   ll_row   <   0   then     return  
   
  gs_zh   =   dw_1.getItemString   (ll_row,   "幢号")  
  gs_dy   =   dw_1.getItemString   (ll_row,   "单元")  
  gs_lc   =   dw_1.getItemString   (ll_row,   "楼层")  
  ls_fh   =   dw_1.getItemString   (ll_row,   "房号")  
  //open   (w_ckhxt)  
   
  //显示图片   -   用大文本处理   -   使用系统打开方式  
  blob lbb_pic,   lb_temp  
   
  setpointer   (hourGlass!)  
  sqlca.autocommit   =   true  
   
  SELECTBLOB   户型图    
  INTO   :lbb_pic  
  FROM 楼盘信息  
  WHERE   幢号   =   :gs_zh   AND  
  单元   =   :gs_dy   AND  
  楼层   =   :gs_lc   AND  
  房号   =   :ls_fh  
  USING   SQLCA;  
  sqlca.autocommit   =   false  
   
  if   SQLCA.SQLCode   <>   0   then    
  messageBox   ("数据库错误",   "读取户型图失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  else  
  if   len   (lbb_pic)   >   0   then  
  long ll_handle,   ll_fileLen,   i,   ll_loops  
   
  ll_handle   =   FileOpen("Temp.jpg",StreamMode!,   Write!,   lockWrite!,   replace!)  
  ll_fileLen   =   len(lbb_pic)  
  if   ll_fileLen   >   32766   then  
  ll_loops   =   long   ((ll_fileLen   -   1)/32766)   +   1  
  else  
  ll_loops   =   1  
  end   if  
  messageBox   (string   (ll_fileLen)   ,   string   (ll_loops)   )     //  
  For   i=1   to   ll_loops   step   1  
          lb_temp   =   Blobmid(lbb_pic,(i   -   1)*32765+1,32765)  
        filewrite(ll_handle,lb_temp)  
  Next  
  FileClose(ll_handle)  
  //打开  
  ShellExecute(handle(this),   '',   "Temp.jpg",   "shell32.dll",   '',   0)  
  else  
  messageBox   ("提示",   "还未上传户型图!",   exclamation!)  
  end   if  
  end   if  
  setPointer   (arrow!)  
  ======================================================================  
   
   
  脚本其实都不用大家仔细看了,基本都是通常的处理方法   ,  
  问题:是我用ODBC连接时,在上传能全部上传(messageBox显示循环次数),   而在读取图片的时候不关怎么样都只能读取   32767字节   (messageBox提示),调式了老半天硬没找出错误,  
   
  刚才实在没办法了,才抱着试一试的心态,把连接方式改为直连(mss),却突然行了  
  但现在MSS连接方式行了,却存在其他问题,如:  
  SELECT "密码",   "姓名"  
  INTO :ls_pwd,   :ls_userName  
  FROM   "Y系统用户"  
  WHERE "ID"   =   :ls_userId  
  USING sqlca;  
  如果在字段两端加上引号用mss连接会出现语法错误(而odbc连接则不会有错误),而偏偏我为了做区分,我一般都加了引号,真是郁闷至极!!  
  我就打算就将读取图片的连接方式改为MSS连接算了,因为程序里只有一个地方用要读图片!  
   
  ================================================  
  我在网上搜索了一下,被图片搞郁闷了的人好真不少   :),所以在百忙之中发出此贴供大家分享(现在真的很忙,一般周末都没得休息)  
   
  现在请大家再讨论一下:  
   
  1:ODBC下读图片只能读32K是不是PB的BUG;  
  2:究竟ODBC连接和MSS连接以及OLE   DB有些什么区别,具体什么时候用什么连接??  
   
  (全部家当就179分了)  
  问题点数:179、回复次数:13Top

1 楼lw1a2(一刀 现在改六点下班了:()回复于 2005-12-16 22:29:28 得分 10

好像大于32K的必须分块循环解决Top

2 楼lzheng2001(1加1)回复于 2005-12-17 11:19:56 得分 10

的确,以前听说过有网友说用ODBC连不行,我一直没有做过测试,因为我都是用直连的,你用什么版本的PB?   最好先打上PB的补丁,或许问题就解决了.Top

3 楼jimmyxc(小谢)回复于 2005-12-17 13:01:02 得分 20

我经常用PB读大文件,asa和ORACLE都用过,用循环读取都没有问题,用的9。0,数据库脚本字段一般来说是不用加引号的,你可以用PB自带的SQL脚本图形界面生成SQL语言,至于直连还是ODBC我觉得直连比较好Top

4 楼zw3214(云之彼端)回复于 2005-12-17 14:14:07 得分 10

图片大于32k好像要分块读!好像不光图片,我这里有本资料说,通过串口读某些硬件上的数据都是32k都传Top

5 楼hygougou(uoguogyh)回复于 2005-12-17 16:12:33 得分 10

odbc没法用这个特性,还有调用存储过程也有问题  
   
   
  用直连或者OLE吧,速度也快些Top

6 楼ghostagain(心情卡片)回复于 2005-12-17 16:15:00 得分 0

PB是9.0   5507         打了补丁,   sql   server   2000   打了sp3补丁    
  看来也可能不是PB或SQL的问题  
   
  不过远程直连有时候会出现“登陆不正确”的错误  
  请问一下,直连要注意些什么,比如是不是端口必须是1433,   SQL要做些什么特殊的设置没有?  
  Top

7 楼lzheng2001(1加1)回复于 2005-12-17 18:25:56 得分 30

1.pb9.0   5507         版本还是比较旧,请试试更新的版本,如   pb9.03   xxxx    
   
  2.端口可以是任意的可用端口.   你可以"服务器网络实用工具"中设置,没什么其它特殊的设置就可以连了  
   
  3.“登陆不正确”是登录的用户名不正确造成的,检查一下SQLCA中的userid项吧Top

8 楼ghostagain(心情卡片)回复于 2005-12-17 19:29:03 得分 0

to   1+1:  
   
  MSS连接方式连接我本机的SQL没问题,连接一个挂在外网上的SQL就说“登陆不正确”,但是我用ODBC能连接上,所以不是密码错误了(不知道是不是他的SQL没打补丁,我的一个合作伙伴,他不SQL挂在外网上的,暂时还没和他取得联系)  
   
  连外我发现用ODBC连接和MSS连接,在PB中存储过程的申明明显不一样,如同一存储过程:  
  ODBC连接只能这样:  
  DECLARE   p_getALTAUTHRT   PROCEDURE   FOR   p_getAlterAuthority    
  (:as_tacheName,      
  :as_tabName,    
  :as_colName   )  
  USING   SQLCA;  
   
  而MSSl连接就需要这样:  
  DECLARE   p_getALTAUTHRT   PROCEDURE   FOR   p_getAlterAuthority    
  @tacheName   =   :as_tacheName,      
  @tabName   =   :as_tabName,    
  @colName   =   :as_colName  
  USING   SQLCA;  
  ==================================================  
  被搞郁闷了   ~~~~~~~~~~~~~~~~~~~~~  
   
   
   
   
  Top

9 楼xyqiqi(琪琪)回复于 2005-12-17 23:52:36 得分 9

楼上的,用第二个好像也可以,我用过。Top

10 楼jimmyxc(小谢)回复于 2005-12-18 09:59:48 得分 50

flen   =   FileLength(ls_name)  
   
  li_FileNum   =   FileOpen(ls_name,   &  
      StreamMode!,   Read!,   LockRead!)  
   
  //   Determine   how   many   times   to   call   FileRead  
   
  IF   flen   >   32765   THEN  
   
      IF   Mod(flen,   32765)   =   0   THEN  
   
  loops   =   flen/32765  
   
      ELSE  
   
  loops   =   (flen/32765)   +   1  
   
      END   IF  
   
  ELSE  
   
      loops   =   1  
   
  END   IF  
   
  //   Read   the   file  
   
  new_pos   =   1  
   
  FOR   i   =   1   to   loops  
   
      bytes_read   =   FileRead(li_FileNum,   b)  
   
      tot_b   =   tot_b   +   b  
   
  NEXT  
   
  FileClose(li_FileNum)  
  /////  
  id=this.getitemnumber(   row,   "IMAGEMODLE")  
  UPDATEBLOB   T_IMAGEMODLE    
  SET   MODLEIMAGE=:tot_b    
  WHERE   IMAGEMODLE=:id  
  using   sqlca;  
  commit;  
  、、、、、  
  blob字段在PB里面可以直接“+”,你的方法也行,效果一样的Top

11 楼lzheng2001(1加1)回复于 2005-12-19 09:41:41 得分 10

说明一下,楼主直连方式在外网连入的话,SERVERNAME请用IP地址连接!Top

12 楼lovelihp(一年多的总结:光顶升不了星)回复于 2005-12-19 09:57:21 得分 10

代码太长了,我太懒   :)Top

13 楼j9dai(翔)(DoItNow)回复于 2005-12-19 12:08:54 得分 10

ODBC是这样子Top

相关问题

  • pb的BUG
  • 急?PB的BUG?
  • 全部家当:(
  • 我对PB和JAVA的一些看法.
  • 最后一点家当
  • 全部家当送高手!!
  • PB又一个bug,复合报表。
  • PB + SQL SERVER 非常严重的 BUG !!!!!!!!
  • 是不是pb的bug,关于clipboard
  • 倾家当产也要问个明白!!

关键词

  • pb
  • 连接
  • 脚本
  • sql
  • 端口
  • 存储过程
  • 代码
  • 数据库
  • lbb
  • sqlca

得分解答快速导航

  • 帖主:ghostagain
  • lw1a2
  • lzheng2001
  • jimmyxc
  • zw3214
  • hygougou
  • lzheng2001
  • xyqiqi
  • jimmyxc
  • lzheng2001
  • lovelihp
  • j9dai

相关链接

  • PowerBuilder类图书
  • PowerBuilder类源码下载

广告也精彩

反馈

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