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

求助:图片存储

楼主zoezxc()2006-06-01 13:43:37 在 PowerBuilder / 基础类 提问

求助:  
  我用的是SQLServer2000的数据库,其中有个学生表t_student,有个字段s_picture(image型,  
  长度为16<好像是系统默认的长度,我改不了>)用来存照片,但是只要照片大于32kb,就存不到数据库中,这该怎么办啊? 问题点数:10、回复次数:12Top

1 楼hzliqing(蚂蚁牙黑)回复于 2006-06-01 15:00:20 得分 0

狠简单~~保证你的图片小于32k~~呵呵~我们单位的好像就是这么做的~Top

2 楼ghostagain(心情卡片)回复于 2006-06-01 15:02:58 得分 0

没分     打死都不说   (FAQ里去找)Top

3 楼zoezxc()回复于 2006-06-01 17:52:43 得分 0

好了,我已经为贴子加分了,不好意思,那是我的第一贴,我还以为我没分可加呢:)  
  ghostagain(心情卡片)     说的(FAQ里去找)是这个吧:  
  http://community.csdn.net/Expert/FAQ/FAQ_Index.asp?id=201309  
  即:  
  先插入一行(没有图片),然后用updateblob更新,具体查查帮助。      
  ---------------------------------------------------------------      
     
  先選擇圖片      
     
  string     ls_path,ls_name      
                                                GetFileOpenName("選擇圖片文件",     ls_Path,     ls_name,'bmp',&      
                                                "支持的圖片文件格式,*.jpg;*.bmp;*.gif;*.rle;*.wmf,"+&      
                                                "位圖(.bmp),*.bmp,"+&      
                                                "JPEG(.jpg;.jpeg),*.jpg;*.jpeg,"+&      
                                                "RunLengthEncode(.rle),*.rle,"+&      
                                                "Windows     MetaFile(.wmf),*.wmf")      
                                                if     this.object.pic_flag[1]     =     '1'     then      
                                                                        long     ll_filelength//最大為2G      
                                                                        decimal{2}     ldec_nk      
                                                                        ll_FileLength     =     FileLength(ls_path)      
                                                                        ldec_nk     =     round(ll_filelength     /     1024,2)      
                                                                        if     ldec_nk     >     1024.00     THEN                                                                              
                                                                                                messagebox('提示','您選擇的圖片大小為:'+string(ldec_nk)+'K,已經超過所規定的大小1024K',stopsign!)      
                                                                                                return      
                                                                        end     if      
                                                end     if      
                                                if     isnull(ls_name)     or     trim(ls_name)=''     then     return      
                                                p_1.PictureName     =     '.\'+ls_name                                                      
                                                this.object.pic_path[1]     =     '.\'+ls_name//right(ls_path,pos(reverse(ls_path),'\')     -     1)      
                                                this.object.pic_name[1]     =     ls_name      
                                                this.object.c_desc[1]     =     '圖片的具體位置:'+     ls_path      
                                                ii_flagtu     =     1      
     
  ---------------------------------------------------------------      
     
  selectblob取出图片数据。具体查查帮助,或者从前的帖子。      
  ---------------------------------------------------------------      
     
  存圖片到數據庫      
     
  if     dw_f.object.pic_flag[1]     =     '0'     then     goto     byend      
  string     ls_picname      
  ls_picname     =     trim(p_1.PictureName)      
  if     not     isnull(ls_picname)     and     trim(ls_picname)<>''     then      
                            blob     lbob_pic      
                            lbob_pic     =     lf_dealpic(ls_picname)      
                //更新圖片文件要控制autocommit參數      
                sqlca.autocommit     =     True                                                      
                            updateblob     z_size_pic_record     set     pic_data     =     :lbob_pic     where     sample_no     =     :ls_sample_no     using     sqlca;      
                sqlca.autocommit     =     False      
                            if     sqlca.sqlcode     =     0     then      
                                                commit;      
                                                li_flag     =     2      
                        else      
                                                rollback;      
                                                li_flag     =     -2      
                        end     if      
  end     if      
  byend:      
  choose     case     li_flag      
                        case     -1      
                                                messagebox('信息提示','圖片信息保存失敗!',stopsign!)      
  。。。。。。。。      
  。。。。。。。。      
  。。。。。。。。      
     
     
  ---------------------------------------------------------------      
     
  然後從數據庫讀圖片到圖片控件      
  //處理圖片      
  Blob         lbob_pic      
  decimal     ldec_n_id      
  p_1.picturename     =     "     "      
     
  SELECTBLOB     pic_data      
  INTO     :lbob_pic      
  FROM     z_size_pic_record      
  WHERE     sample_no     =     :     ls_sample_no     using     sqlca;      
     
  if     isnull(lbob_pic)     then      
                        p_1.picturename     =     dw_f.object.pic_path[1]      
                        istr_pic.picturename     =     dw_f.object.pic_path[1]      
  else      
                        p_1.SetPicture(lbob_pic)      
            istr_pic.picturevar     =     lbob_pic      
  end     if  
     
     
  Top

4 楼zoezxc()回复于 2006-06-01 18:04:06 得分 0

我在"照片入库"按钮click()下的代码如下,但是数据库中只能存下32kb,超过32kb的部分,就存不下了.这该怎么办呢?请高人指教,多谢多谢  
  blob   emp_pict  
  emp_pict=ole_1.objectdata  
  row_count=dw_student.rowcount()  
  if   row_count>0   then  
  ksbh=trim(dw_student.getitemstring(dw_student.getrow(),"s_bkh"))  
  end   if  
  updateblob   "t_student"   set   s_picture=:emp_pict   where   s_bkh=:ksbh;  
  //s_bkh是数据库中,学生编号的字段  
  if   sqlca.sqlnrows>0   then  
  commit;  
  messagebox("提示信息","存入"+string(len(emp_pict))+"个字符"+",入库成功")  
  else  
  rollback;  
  messagebox("提示信息","入库失败")  
  end   ifTop

5 楼ghostagain(心情卡片)回复于 2006-06-01 20:13:27 得分 0

上传图片例子:  
  ----------------------------------------  
   
  if   dw_1.event   ue_update   ()   <>   1   then   return  
   
  long ll_row  
   
  ll_row   =   dw_1.getRow   ()  
  if   ll_row   <   0   then     return  
   
  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  
  string ls_idNo //身份证号码      
   
  ls_idNo   =   dw_1.getItemString   (ll_row,   "身份证号码")  
   
  //ls_currDir   =   getCurrentDirectory   ()     //当前路径      
   
  li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename,   "jpg",   &  
      "JPG文件(.jpg),*.jpg"     )  
   
  //li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename,   "jpg",   &  
  //     "JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp"     )  
  //changeDirectory   (ls_currDir)  
   
  IF   Li_ret   <=   0   then   return    
  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 J驾乘人员  
  SET 照片   =   :lbb_total  
  WHERE   身份证号码   =   :ls_idNo  
  USING   SQLCA;  
  sqlca.autocommit   =   false  
  if   SQLCA.SQLCode   =   0   then  
  // messageBox   ("提示",   "保存图片成功!")  
  wf_showPic   (ll_row)  
  else  
  messageBox   ("数据库错误",   "保存图片失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  end   if  
   
   
   
   
  读图片例子:  
  ------------------------------------------  
  //显示照片  
   
  string ls_idNo  
  string ls_fileName  
  long ll_row  
  blob lbb_text,   lb_temp  
   
  ll_row   =   dw_1.getRow   ()  
  if   ll_row   <=   0   then   return   1  
  ls_idNo   =   dw_1.getItemString   (ll_row,   '身份证号码')  
  ls_fileName   =   gs_currDir   +   '\tempPic\'   +   n_sysInfo.is_top_name  
   
  setpointer   (hourGlass!)  
  SELECTBLOB   照片  
  INTO   :lbb_text  
  FROM J驾乘人员  
  WHERE   身份证号码   =   :ls_idNo  
  USING   SQLCA;  
  //messageBox   ('',string   (   len   (lbb_text)/32766)   )  
   
  if   SQLCA.SQLCode   =   -1   then    
  messageBox   ("数据库错误",   "从数据库中读取文件失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  return   -1  
  else  
  if   len   (lbb_text)   >   0   then  
  long ll_handle,   ll_fileLen,   i,   ll_loops  
   
  ll_handle   =   FileOpen(ls_fileName,   StreamMode!,   Write!,   lockWrite!,   replace!)  
  ll_fileLen   =   len(lbb_text)  
  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_text,(i   -   1)*32765+1,32765)  
        filewrite(ll_handle,lb_temp)  
  Next  
  FileClose(ll_handle)  
   
   
  string   ls_nullStr  
  setNull   (ls_nullStr)  
  ShellExecute(handle   (this),   ls_nullStr,   ls_fileName,   "shell32.dll",   ls_nullStr,   0)  
  return   1  
  else  
  messageBox   ("提示",   "还没有上传文件,请先上传!",   exclamation!)  
  return   -1  
  end   if  
  end   if  
  setPointer   (arrow!)  
  return   1Top

6 楼zoezxc()回复于 2006-06-06 22:18:02 得分 0

To     ghostagain(心情卡片):  
  谢谢了:)  
  我把你贴出来的那几段程序,好好看了看,有几个还是看没明白,  
  //显示照片中的ls_fileName   =   gs_currDir   +   '\tempPic\'   +   n_sysInfo.is_top_name,  
  gs_currDir,n_sysInfo.is_top_name这几个是什么意思啊?应该在哪定义呢?Top

7 楼ghostagain(心情卡片)回复于 2006-06-07 08:39:42 得分 0

ls_fileName   是个文件名称,是将图片从数据库里取出来,暂时存放在本地磁盘力,然后显示在图片控件中  
  您可以计先就这样写试试:  
  ls_fileName   =   'c:\temp.jpg'Top

8 楼zoezxc()回复于 2006-06-07 20:29:42 得分 0

To   ghostagain(心情卡片):  
  我已按你的建议,改为ls_fileName   =   'c:\temp.jpg';  
  到现在,我已经能把图片存入数据库,但是还有的问题是:把图片从数据库中拿出来显示不成功啊.急啊。  
  Top

9 楼ghostagain(心情卡片)回复于 2006-06-07 21:47:39 得分 0

贴出你的代码看看Top

10 楼zoezxc()回复于 2006-06-07 22:46:01 得分 0

1.按钮“照片入库”的代码如下:  
   
  long   ll_row  
  ll_row   =   dw_student.getRow   ()  
  if   ll_row   <   0   then     return  
  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  
  string   ls_idNo//学号  
   
  ls_idNo   =dw_student.getItemString   (ll_row,   "s_bkh")  
  li_ret=GetFileOpenName("选择图片文件",ls_pathname,ls_filename,   "jpg",   &  
      "JPG文件(.jpg),*.jpg,BMP文件(.bmp),*.bmp"     )  
   
  //ole_1.insertfile(ls_pathname)  
  IF   Li_ret   <=   0   then   return    
  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   t_student  
  SET   s_picture   =   :lbb_total  
  WHERE   s_bkh   =   :ls_idNo  
  USING   SQLCA;  
  sqlca.autocommit   =   true  
  if   SQLCA.SQLCode   =   0   then  
  messageBox   ("提示",   "保存图片成功!")  
   
  else  
  messageBox   ("数据库错误",   "保存图片失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  end   if  
   
   
  2.按钮“显示图片”的代码如下:(运行后,它出现的错误是NOt   a   JPEG   file:starts   with   0x42   0x4d)  
  string   ls_idNo  
  string   ls_fileName,gs_currDir  
  long   ll_row  
  blob   lbb_text,   lb_temp  
  ll_row   =   dw_student.getRow   ()  
  if   ll_row   <=   0   then   return   1  
  ls_idNo   =   dw_student.getItemString   (ll_row,   's_bkh')  
  ls_fileName   =   'c:\temp.jpg'  
  setpointer   (hourGlass!)  
  sqlca.autocommit   =   true  
  SELECTBLOB   s_picture  
  INTO   :lbb_text  
  FROM   t_student  
  WHERE   s_bkh   =   :ls_idNo  
  USING   SQLCA;  
  sqlca.autocommit   =   false  
  messageBox   ("string   (   len   (lbb_text)/32766)   :",'string   (   len   (lbb_text)/32766)   :'+string   (   len   (lbb_text)/32766)   )  
  p_1.setpicture(lbb_text)  
   
  if   SQLCA.SQLCode   =   -1   then    
  messageBox   ("数据库错误",   "从数据库中读取文件失败!~r~n~r~n错误代码:"   +   &  
  string   (sqlca.sqlDbCode)   +   "~r~n详细信息:"   +   &    
  sqlca.sqlERRText,   stopSign!)  
  return   -1  
  else  
  if   len   (lbb_text)   >   0   then  
  long   ll_handle,   ll_fileLen,   i,   ll_loops  
   
  ll_handle   =   FileOpen(ls_fileName,   StreamMode!,   Write!,   lockWrite!,   replace!)  
  ll_fileLen   =   len(lbb_text)  
  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_text,(i   -   1)*32765+1,32765)  
        filewrite(ll_handle,lb_temp)  
  Next  
  FileClose(ll_handle)  
  string   ls_nullStr  
  setNull   (ls_nullStr)  
  ShellExecute(handle   (this),   ls_nullStr,   ls_fileName,   ls_nullStr,   ls_nullStr,1)  
  ole_1.insertfile(ls_fileName)  
   
  messageBox   ("提示",   "show!",   exclamation!)  
  return   1  
  else  
  messageBox   ("提示",   "还没有上传文件,请先上传!",   exclamation!)  
  return   -1  
  end   if  
  end   if  
  setPointer   (arrow!)  
  return   1Top

11 楼ghostagain(心情卡片)回复于 2006-06-08 09:23:43 得分 10

您上传的可能不是Jpg图片吧  
  这样您就应该在上传图片时候记录图片文件的后缀名(我原来的ls_fileName   =   gs_currDir   +   '\tempPic\'   +   n_sysInfo.is_top_name中的is_top_name是从数据库里面读出来的,包含了后缀名)  
  所以您还要在数据库里加一个字段记录后缀名,从数据库中读出图片临时存放在ls_fileName中,而ls_fileName的后缀名也应该从数据里面读Top

12 楼zoezxc()回复于 2006-06-21 12:49:39 得分 0

对ghostagain(心情卡片)   说声谢谢,呵呵:)Top

相关问题

关键词

得分解答快速导航

  • 帖主:zoezxc
  • ghostagain

相关链接

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

广告也精彩

反馈

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