




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、/读保释存图片 string ls_pathname, ls_filename integer li_value,li_FileNum,loops,i long ll_fileLength,bytes_read,new_pos blob b, tot_b Blob gb_photo INSERT INTO PJ_TP(BB) VBLUES ('1') USING SQLDB; DOMMIT USING SQLDB; li_value = GetFileOpenName("选择相片", & + ls_pathname, ls_filename, &qu
2、ot;jpg","Jpg Files (*.jpg),*.jpg") IF li_value = 1 THEN / Set a wait cursor SetPointer(HourGlass!) / Get the file length, and open the file ll_fileLength= FileLength(ls_filename) li_FileNum = FileOpen(ls_filename, & StreamMode!, Read!, LockRead!) / Determine how many times to call
3、 FileRead IF ll_filelength > 32765 THEN IF Mod(ll_filelength, 32765) = 0 THEN loops =ll_filelength/32765 ELSE loops = (ll_filelength/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 / IF i=1 then st_1.tex
4、t=string(tot_b) end if / NEXT FileDlose(li_FileNum) gb_photo=tot_b UPDBTEBLOB PJ_TP SET photo=:gb_photo WHERE BB='1' USing sqlca; IF Sqlca.SQLNRows > 0 THEN DOMMIT USING SQLDB; END IF P_1.setpicture(gb_photo) st_1.text=string(len(gb_photo) Elseif li_value=-1 then MessageBox("选择相片&quo
5、t;,"打开文件错误!") End If /从表里读取图片 Blob gb_photo SELEDTBLOB photo INTO :gb_photo FROM PJ_TP where BB='1' Using SQLDB; st_1.text=string(len(gb_photo) P_1.setpicture(gb_photo) * * * 二、前言:在数据库的开发历程中,经常需要在数据库中储存一些备注信息,而这些个备注信息的内容一般较大,格式多样-如可能是语音文件、视频文件、图片文件、文这篇文章件等,如何在PB中实现这些个格式不同的备注文件的存取及预
6、览,一直是PB开发人员比较关心的一个问题,这篇文章系统的介绍了三种存取备注二进制信息的方法。 对备注二进制信息的储存可以采用以下三种方式; 方法一:文件保存在固定的路径下,数据库中存取文件路径和名称 方法二:数据库中用blob类型或者varbinary类型字段储存备注文件 方法三:在本地用OLE储存结构储存备注文件 1、OLE的基本概念 OLE是Object Linking Embedding(对象链结与嵌入)的缩写,它可以使windows应用程序共享数据和程序。 2、OLE控件 在PB中OLE控件是一个OLE对象的包涵器,可以施用服务器应用程序提供的功能和命令来编纂对象,也可以施用自动化OL
7、E交互,在程序中激活对象和向服务器应用程序送出命令;在PB 的window画板中的OLE控件容许用户从多个应用程序嵌入和链结组件 2.1成立和设置OLE控件 从window画板中选择OLE控件插入window。 当成立一个OLE控件并且插入一个对象时,PB将激活服务器应用程序以容许对对象举行编纂和修改;在使OLE中的对象称为非勾当状态后,可以施用控件属性选项卡来设置控件的属性。 2.2 激活修改window画板中的OLE对象 在OLE控件的弹出菜单中选择open可以激活画板中OLE对象 施用服务器应用程序修改OLE对象 结束修改:使对象恢复为非勾当状态,只要单击服务器应用对象之外的任何区域便可
8、,也可以直接封闭服务器应用程序的窗口。 2.3 嵌入和链结OLE控件 可以将OLE对象嵌入或者链结到自己的应用程序中。嵌入对象的数据放在应用程序中,在开发历程中这些个数据放在应用程序的PBl库中,当生成应用后,这些个数据将存放在exe或PBd文件中,虽然在程序的运行历程中可以修改,但修改的数据不会保存;链结对象的数据存放在PB应用程序以外,当链结一个对象时,在PB应用程序中不存放数据文件,而是存放引用数据的指针, 施用链结的数据,对数据的管理和保存都由服务器应用程序卖力。这样可以用服务器应用程序修改处理数据,处理后的数据可以保存回原文件中。链结方式应用于需要多个应用程序共享的数据文件,任何一个
9、应用程序修改了数据文件,都将影响到所有链结该文件的应用程序。 2.4 OLE控件的激活方式 OLE控件的激活方式有offsite和in-place两种激活方式,offsite激活方式是指在PB应用程序的界面以外单独打开OLE对象,in-place激活方式是指PB应用程序的界面的原位置打开OLE对象。在数据窗口中的dbOLE默许的是offsite激活方式,而window中的OLE默许的激活方式是in-place。 在PB应用程序中可以用命令 OLE_control.active(offsite) 或者OLE_control.active(in-place)设置OLE对象的以何种方式打开。 2.5
10、 设置和插入OLE对象 在程序运行时可以用函数: OLE_control.insertfile(soucefile) 插入对象 OLE_control.objectdata = blobvar 设置对象 3、OLE储存 3.1 OLE储存(OLEstorage)的概念 OLE储存(OLEstorage)是OLE数据的一个堆栈,储存有如磁盘上的目次结构,它可以是一个OLE对象,也可以包含在OLE对象中,每一个对象都包含在OLE储存或者储存内的子储存内。保存在OLE储存中数据称作OLE流(OLE stream),OLE流同OLE对象的瓜葛有如文件同目次的瓜葛。含有OLE对象的储存或子储存可以当做是
11、属于特殊服务器的信息,在该层次之下的各部分都可以被相应的服务器程序操作。OLE储存对象是类用户对象,可以申明相应类型的变量,成立与之相应的实例和打开储存等,在施用完储存后需要封闭储存、开释分配的内存。 3.2 OLE储存的打开和保存 OLE储存可以用open函数打开,open函数的格式为: Olecontrol.Open(OLEsourcefile), 此函数在OLEsourcefile不存在时,自动创建该文件,所以创建OLE文件也用该函数; OLE储存可以用save函数保存,save函数的格式为: OLEcontrol.save() / 保存OLE控件 OLEstorage.save() /
12、保存OLE储存 4、处理blob类型数据 对于大二进制数据,在PB Script中是用blob数据类型表示并加以处理。标准S语句中的select、insert和update语句无法直接查询blob类型的数据,在PB中操作blob类型的数据只能用专用的语句,从数据库中查询blob类型的数据的命令是: selectblob restofselectstatement using transactionobject; 更新数据库中blob类型数据的格式是: updateblob tablename set blobcolumn = blobvarible restofupatestatement u
13、sing transctionobject; 如连接的数据库是sybase或者Sql,则selectblob和updateblob语句要求数据库的自动提交方式为true,所以在在每次调用selectblob和updateblob语句以前必须用命令 Sqlca.autocommit=true,把数据库的自动提交方式设置为true,在updateblob语句的结束后,再用命令Sqlca.autocommit = false,把自动提交方式设置为false。 索数据的参数(如flag),然后在可修改列的Protect后的框中输入(user_name是该DataWindow中的一列,代表输入者的名称)
14、: 5、数据窗口的blob列 5.1 数据窗口blob列的功能 在PB 的datawindow画板中DBOLE控件容许用户利用这个控件浏览和操作数据库中的大二进制数据,即通过DBOLE控件可以作如次操作: 往数据库中储存大二进制数据,如:excel事情表、word文档、视频文件、图片文件等各类格式的文件; 从数据库中检索数据到datawindow对象; 施用OLE服务器程序察看修改数据; 将修改后的数据保存次数据库; 5.2 在数据窗口中添加blob列的的步调 1) 选择具备二进制字段的数据表作为数据源成立一新的数据窗口(该窗口可以至少需要包含非数据库表的标识列) 2) 选择insert -c
15、ontrol-OLE database blob 菜单,在数据窗口的detail节中要插入blob列的位置单击鼠标,这时将预示如图1所示的对话框 底下解释这些个属性的具体含义 1) client class: 客户类名,默许为datawindow 2) client name:客户名,默许为untitled 3) table: 选择含有blob列的数据库表,所选表的字段将出现在右侧的large binary/text column列表框中。 4) large binary/text column:选择一个blob类型的字段列 5) key clause:检索和更新blob数据的要害字抒发式此中
16、施用带冒号前缀的变量指出是数据窗口对象的列,如 抒发式 id=:id,id是数据库表中的列,变量指出数据窗口对象的列 6) filetemplate :要是需要OLE应用服务器每次打开相同的文件,则在filetemplate框中输入文件名。 7) OLE class :要是不需要OLE应用服务器每次打开相同的文件,则在OLE class框中选择一个OLE类,如Pbrush。 8) Dlient name expression:预示在OLE服务器应用程序窗口标题的书契,可以输入为:"对应记录的id号是"+id 单击ok按钮封闭对话框,将dbole列添加到适当的位置,保存数据窗
17、口。 预览则可以对数据库中的blob数据举行存取,可是在新建的记录中只能存取OLE class框中选择的一种格式的blob数据,不能储存多种格式的数据;但要是数据库中存有多种格式的数据,可以预览各类格式的数据。 6、源程序成立 1) 首先在数据库中成立如次结构的表blobsave: 字段名称 数据类型 备注 id char(4) primairy key index s_path char(50) pic binary (50) 2) 在PB成立PBl库blobsave.PBl 3) 在PBl库blobsave.PBl中成立应用blobsave 在应用的open事件中设置数据库连接程序(本程序
18、中采用的是odbc方式连接数据库,读者可根据自己所成立的数据库的不同选用不同的连接方式,以下连接数据库的代码也有所改动,至于连接不同的数据库的方法,请参考有关资料,这篇文章不做详细介绍): SQLDB.DBMS = "ODBD" SQLDB.ButoDommit = False SQLDB.DBParm = "Donnectstring='DSN=blob'" connect; open(w_main) 此中命令按钮cb_path的clicked中的代码格式如次:open(w_path) 此中命令按钮cb_dbblob的clicked中的
19、代码格式如次:open(w_dbblob) 此中命令按钮cb_OLEblob的clicked中的代码格式如次:open(w_OLEblob) 4) 成立数据窗口dw_blobsave 按照上文中成立数据窗口的blob列的方法成立数据窗口dw_blobsave如图所示: 此中:add,del,save,cancel,retrieve等别离为数据窗口dw_blobsave的append row,delete row,update,retrieve动作按钮。 首先创建实例变量 OLEstorage stor1 然后如图成立窗口w_path,此中数据窗口控件dw_1的rowfocuschanged中的
20、代码如次: long row_num row_num=dw_1.getrow() if row_num >0 then ole_1.insertfile(dw_1.object.s_pathrow_num) end if 此中数据窗口dw_1的buttonclicked中的代码如次: if ="cbselect" then long row_num row_num=dw_1.getrow() string filepath,filename getfileopenname("请选择备注文件",filepath,filename) d
21、w_1.object.s_pathrow_num=filepath ole_1.insertfile(filepath) end if 保存窗口w_path 6) 成立窗口w_dbblob 打开w_path,把其另存为w_dbblob,改变数据窗口dw_1的rowfocuschanged中的代码如次: blob text1 long row_num row_num=dw_1.getrow() if row_num>0 then string id id = dw_1.object.idrow_num sqlca.autocommit=true selectblob pic into :t
22、ext1 from blobsave where id = :id; ole_1.objectdata=text1 sqlca.autocommit=false end if 改变数据窗口dw_1的buttonclicked中的代码如次: long row_num if ="cbselect" then row_num=dw_1.getrow() string filepath,filename getfileopenname("请选择备注文件",filepath,filename) dw_1.object.s_pathrow_num=f
23、ilepath ole_1.insertfile(filepath) end if if ="cbsave" then string id sqlca.autocommit = true blob text1 text1 = ole_1.objectdata dw_1.update() commit; row_num=dw_1.getrow() id=dw_1.object.idrow_num updateblob blobsave set pic = :text1 where id = :id ; commit; sqlca.autocommit = FB
24、LSE dw_1.retrieve() dw_1.scrolltorow(row_num) end if 保存窗口w_dbblob 7) 成立窗口w_OLEblob 打开w_path,把其另存为w_OLEblob,在窗口w_OLEblob的open事件中写入以下代码: stor1 = create olestorage stor1.open("c:p1.ole") /打开或创建ole文件 在窗口w_OLEblob的close事件中写入以下代码: destroy stor1 改变数据窗口dw_1的rowfocuschanged中的代码如次: blob text1 long r
25、ow_num row_num=dw_1.getrow() if row_num>0 then string id id = dw_1.object.idrow_num ole_1.open(stor1,"w"+id) end if 改变数据窗口dw_1的buttonclicked中的代码如次: long row_num if ="cbselect" then row_num=dw_1.getrow() string filepath,filename getfileopenname("请选择备注文件",filep
26、ath,filename) dw_1.object.s_pathrow_num=filepath ole_1.insertfile(filepath) end if if ="cbsave" then string id row_num=dw_1.getrow() id=dw_1.object.idrow_num ole_1.saveas(stor1,"w"+id) stor1.save() end if 保存窗口w_OLEblob,运行应用程序便可。 7、三种方法的优缺点 方法一:文件保存在固定的路径下,数据库中存取文件路径和名称可以节
27、省数据空间,避免了数据库过度膨胀,但备注文件必须在必然的目次下,不能亡失,且统一目次下文件不能同名,对文件的管理造成必然的困难,别的,在OLE控件中浏览预示备注文件时,由于每次都要调用服务器程序,所以速率较慢。 方法二:在数据库中用blob类型或者varbinary类型字段储存备注文件,当文件储存在数据库中以后,就可以删除硬盘上原来的临时文件,不需要庞大的二进制文件管理,且数据库可以储存在收集服务器上,对数据的共享很是利便。 方法三:在本地用OLE储存结构储存备注文件。可以把所有的二进制文件信息储存在一个OLE储存文件中,管理比较利便。当二进制文件信息储存后,可以删除原来的临时文件;因为打开储
28、存文件后不需要每次执行服务器程序来预示储存信息,所以存取速率较快。 申明:这篇文章在PB6.5,Sql anywhere数据库和PB6.5,Sql Server数据库下,windows98,windows me,NT4.0平台上试验通过。 * * * 三、 在企业人事管理信息系统设计中,经常要涉及到职工相片的处理问题,要是采用传统的文件名方式储存,无益于数据的共享。我们在系统中利用sql server作为工资管理信息系统的后台数据库,利用image数据类型对相片举行储存,前台采用powerbuilder对相片举行处理,大好地实现了相片数据的储存和共享。 在pb中没有image数据类型,但pb中
29、提供的blob二进制对象,可用于储存大容量数据,例如图象、大文本等,并且在pb中提供了对blob数据举行特殊处理的sql语句:selectblob和updateblob,可以处理数据库中的image数据类型。具体语法如次: selectblob 列名into :blob变量 from 表名 where 条件 using 事务对象 updateblob 表名 set 列名:=blob变量 where 条件using 事务对象 如:selectblob photo into:lb_photo from rsdab where bh=1001 ; 注意:这两条sql语句每次只能归回一行数据,否则将失
30、效。在处理中我们主要利用了这两条sql语句,用图形控件(picture)来预示相应的相片,施用图片控件的setpicture函数实现。 在具体实现中,人事管理的职工基本情况(人事档案表(rsdab),主要有职工编号、姓名、部分编号及职工其它情况和相片)录入界面如图所示。 程序首先从数据库中掏出人事档案表中第一笔记录并预示,但相片字段要作特殊处理,因为一般的sql语句不能操作image字段。因此在窗口open事件中写上如次的代码: blob lb_photo string ls_bh /检索数据库中人事档案数据 dw_1.settransobject(sqlca) dw_1.retrieve()
31、 ls_bh=dw_1.getitemstring(1,bh) /获得当前预示的第一个职工的相片数据并在图片控件中预示 selectblob photo into :lb_photo from rsdab where bh=:ls_bh using sqlca;p_1.setpicture(lb_photo) 装入相片按钮的代码如次,主要实现从外部装入相片图形。 integer fh, ret blob emp_pic,lb_photo string filename, named,ls_bh,defext = bmp string filter =图形文件(.bmp), .bmp long
32、fsize,ls_row int num,i/从磁盘选择图形文件 ret = getfileopenname(选择文件, filename,named, defext, filter) /读取文件内容至bolb变量lb_photo中 if ret = 1 then fsize=filelength(filename) fh=fileopen(filename, streammode!) /设置文件读取次数,注意pb中fileread函数 /每次最多能读取3276五个字节数据 num=int(fsize/32765)1 if fh 1 then for i=1 to num fileread(f
33、h, emp_pic) lb_photo=lb_photoemp_pic next fileclose(fh) end if end if /设置图形节制预示图形内容 p_1.setpicture(lb_photo) /获得当前预示数据的职工编号ls_bh ls_row=dw_1.getrow() ls_bh=dw_1.getitemstring(ls_row,bh) /施用updateblob更新数据库中相片列的内容 updateblob rsdab set photo= :lb_photo where bh=:ls_bh using sqlca; if sqlca.sqlcode0 the
34、n messagebox(提醒信息,保存失败,exclamation!, ok!, 1) rollback using sqlca; /更新失败则回滚事务 else commit using sqlca; /更新乐成则提交事务 end if 以上是程序的主要代码,界面中其它的按钮对象也要对相片作相应处理,如按钮下一个中,需根据职工编号动态改变职工相片的内容,读者可按上述方法自己写出其它事件的代码。 在处理中首先要将职工相片施用电子扫描仪转换成图形文件或用数字照相机拍摄为图形文件,然后利用程序将图形文件读入并储存在数据库中。固然还可以对这个程序举行革新,如增加对相片的实时电子扫描处理,增加相片的
35、编纂功能等。还可施用sybase公司的最新产物pb 7.0中的picture节制,该控件支持jpg、gif等格式的图形文件,可以更利便地处理相片。 本程序在sql server 7.0、powerbuilder 6.5中运行通过 * * PB中保存图片 /* * "选择"按钮代码: lb_image = gf_open_pic(p_1,lb_image) p_1.setpicture(lb_image) /* * "清除"按钮代码: p_1.picturename = '''' p_1.picturename = '
36、;'''/(需要两次) setnull(lb_image) /* * 函数gf_open_pic: / / /Bdd by Jeffrey Jiang on 2001.11.13 /选择图片 / / /Modfiy by Jeffrey Jiang on 2001.11.15 /当图片字节大于32765时,轮回读图片 / / integer li_file,li_ret,loops,i string ls_file,ls_path blob lb_small long flen,bytes_read,new_pos /search the file li_ret = g
37、etfileopenname("选择图片文件",ls_path,ls_file, & "BMP","图片文件(*.BMP),*.BMP") if li_ret = 1 then p_1.picturename = '''' p_1.picturename = '''' setnull(lb_image) if li_file <> -1 then / Set a wait cursor setpointer(hourglass!) flen = filelength(ls_file) li_file = fileopen(ls_path,streammode!,read!,lockread!) / Determine how many
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 清洁处理承包合同协议书
- 渠道承包合同协议书模板
- 渣土车司机劳务合同范本
- 网上买卖设备的合同范本
- 电力产权分界协议协议书
- 湖北省劳动合同补充协议
- 艺人与酒吧合作合同范本
- 材料未签合同的进场协议
- 电梯维修安全协议书合同
- 签了合作协议不履行合同
- 智慧林业综合管理平台解决方案
- 消防应急预案电子版
- 2022年全国《网络安全学习教育知识》竞赛试题库与答案
- DL∕T 5142-2012 火力发电厂除灰设计技术规程
- 中国特发性面神经麻痹神经修复治疗临床指南2023年
- 西安市灞桥区2024年公开招聘事业单位工作人员历年公开引进高层次人才和急需紧缺人才笔试参考题库(共500题)答案详解版
- (正式版)JBT 14933-2024 机械式停车设备 检验与试验规范
- JJG-52-1999弹簧管式一般压力表、压力真空表和真空表
- 新华DCS软件2.0版使用教程-文档资料
- 弗洛伊德和荣格对心理创伤的理解
- 志愿服务证明(多模板)
评论
0/150
提交评论