转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件使用 >> 常用软件 >> 正文
PowerBuilder应用开发系列讲座(29)         

PowerBuilder应用开发系列讲座(29)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:762 更新时间:2009/4/24 21:43:50
p align="left">一、如何使用BLOB数据类型

  我们在使用PowerBuilder编程的过程中,总是不可避免地要用BLOB(BinaryLargeObjects,大型二进制对象)字段及其相关函数这里我们来介绍一下使用BLOB的方法时使用BLOB数据类型。

  在下列情况下,我们可能要在PowerScript语言中使用到BLOB数类型:要将OLE对象(如图形、声音等)存入您的数据库中;要将大型的二进制对象存入您的数据库中;所要操纵的文本对象过大,以致于一般的字符串函数无法其操作;所使用数据库的数据类型PowerBuilder不能支持,如SQLBase中logvarchar这一数据类型,所以您只能使用blob函数对其进行操纵。

  您所使用的DBMS中,怎样的数据类型可以在PowerScript中与BLOB数类型相对应?这里罗列的一些常见数据库的数据类型,其它类型的数据请查询该数据库的相关文档,及PowerBuilder的用户手册。

DBMS数据类型
WatcomSQLlongbinary,longvarchar
Oraclelongraw
SQLServerImage,Text
InformixText
MDIGatewayDB/2Longvarchar
SQLBaselongvarchar
AllBaselongvarchar
DB2/2N/A

二、在数据窗口中使用OLE列
  在数据窗口中使用OLE列,必须满足以下要求:包括OLE列的表必须:具有一个可以对应成为BLOB的数据类型;一个OLE列必须允许为空;必须有主键;如果您使用的开发环境是SQLServer,您必须将AUTOCOMMIT设置为TRUE;在数据窗口画笔中指定数据源的列名时,存储BLOB数据的列不能被包括;
  在数据窗口设计时,选择菜单Ojbect|OLEDatabaseBlob,然后在设计窗口上空点一下,这时会出现这样的一个屏幕:在这个定义属性的窗口中,大部分的内容与定义其它数据窗口列属性的窗口大致相当,只有这个definition项与其它列不同,这里特别说明一下:上面几项内容的填写较易理解,事实上只要保留其缺省值就可以了。
  KeyClause:这一项的内容是PowerBuilder用以确定在select和update语句中如何使用WHERE子句的。一般我们使用这一个表的主键就可以了。在这个例子里,就相当于where子句是"...whereid=:id"。请注意理解这两个“id”不同的含义和各自的指代。   FileTemplate:用以指定您所希望的这个OLE对象使用的公共模板。在本列中,我们保留其为空。 侨绻娲⒌氖莣ord文件,您就应当指定一个DOC文件,或者是normal.dot文件等。
  OLEClass:Description(OnlyClassisused):如果您没有使用文件模板,您就应当在这里指定一个应用类,本例中我们使用PaintBrush。如果您打算使用的应用类并没有包括在这个下拉式列表框中,您就应当在Windows的注册文件中加入:在Windows3.1中您 应当修改win.ini文件,而在Windows95和WindowsNT中您应当调用REGEDIT应用程序。
  ClientNameExpression:这个表达式是用以得到blob列中每行的不同值。这可以使OLE对不同的blob行引用不同的对象。
  完成了数据窗口的设计后,您可以在其设计预览方式下测试这个OLE列。只要在这个对象上双击,PowerBuilder就会自动启动服务器应用,进入一个新文件的编辑和一个模板拷贝的编辑,这当然要根据您设定的是对象类还是文件模板。为了使这个OLE列更醒目,您可以在其背后加入一幅图,或加上边框。
  当您确实地在这一列中存储了数据,在这一列的位置上就会出现一个与您所使用的OLE服务器应用相对应的图标。

对OLE列的更新

  OLE列只能够在数据窗口中得以更新。OLE对象存储在OLE对容器(container)之中,并为OLE服务器提供信息和它们的类名。其中的内容更新时,这个容器必须保留。这个功能是设计数据窗口和OLE列对象之内的,可是如果您打算在数据窗口外更新这个Blob对象,您就将破坏这个容器。

使用OLEActivate函数

  如果您打算使用程序激活一个OLE列,而不是等用户双击这列,您就可以使用OLEActivate函数。这个函数的语法为:
  datawindowcontrol.OLEActivate(row,column,verb)
  此外您打算以非零的“verb”值激活OLE列,也需要用到这个函数。关于“verb”值的定义,是根据不同的OLE服务器而定的,您必须查询所使用的OLE服务器文档。使用windows95的用户可以用REGEDIT查询注册窗口的数据库。键入REGEDIT/V可以看到整个注册窗口的树型列表。

  例如我们有一个名为dw_sound的数据窗口,其中有一个OLE列“sound_blob”包含的是.wav文件,我们希望使用微软的QuickRecrder作为OLE服务器,我们可以这样调用这个函数 

  dw_sound.OLEActivate(5,"sound_blob",1)
  在QuickRecorder中“verb”值为1表示编辑。
  又如:
  dw_sound.OLEActivate(2,4,0)

  表示激活OLE服务器调用数据窗口中第二行第四列的数据,“verb”为0表示演奏这个.wav文件。
  使用Sybase用户应注意的问题:

  Sybase对于OLE列的控制同其它数据库比有一些小小的限制,这体现在Sybase的text数据类型上。由于Sybase的字符串函数的作用,作为blob字段的text数据类型最大只能到4K。
三、不使用OLE方式对Blob进行操作:

  在PowerScript中提供给您许多不使用OLE而处理大型二进制大型的方法。例如下例将数据读入Blob列:
  /*本段代码将读取一个超过32766字节的文件,这个代码可以用以读取Text文本和Bitmap图象。*/

SetPointer(HOURGLASS!)
intli_filenum,li_loops,li_counterlongll_filelen,ll_ll_bytes_read, ll_new_posbloblb_ourblob,
lb_tot_bll_filelen=FileLength(sle_filename.text)

//获取文件的大小

li_filenum=FileOpen(sle_filename.text,STREAMMODE!,READ!,LOCKREAD!) //指定该文件为只读,li_filenum为这个文件的句柄
IFll_filelen$#@62;32766THEN
li_loops=((ll_filelen-1)/32766)+1
ELSE
li_loops=1
ENDIF
/*FileRead()函数不支持读取大于32K的文本,
计算将使用FileRead函数的次数*/
//读文件...
FORli_counter=1toli_loops
ll_bytes_read=FileRead(li_filenum,lb_our_blob)
lb_tot_b=lb_tot_b+lb_our_blob
ll_new_pos=ll_new_pos+ll_bytes_read
FileSeek(li_filenum,ll_new_pos,FROMBEGINNING!)
NEXT
FileClose(li_filenum)
//现在lb_tot_b已包括了文件的内容,如果这个文件是位图
文件,可对其使用SetPicture函数,如果是文本文件,可使用stri
ng()函数将其转成text文件。
SetPicture(p_my_picture,lb_tot_b)

  现在您已有了一个存在blob变量中的BLOB数据,您可以将其写入数据库中。如果您不打算使用OLE,您可以使用在PowerScript中使用SELECTBLOB,UPDATEBLOB语句。同时,必须满足以下条件:
  1.您必须在数据库中定义有与blob数据类型相等的数据类型(如在Watcom中的LongVarchar和LongBinary,在SQLServer中的Image,在Oracle中的longraw等)。
  2.每一个定义有blob字段的表必须有主键。
  3.blob列必须允许为空。
  4.您打算写入blob数据的这一条记录必须已经输入数据,也就是说您只能使用UPDATE的方式写入blob数据。
  5.SQLSERVER的用户必须在使用BLOB功能前将AUTOCOMMIT设置为TRUE,在BLOB功能结束后可再恢复回FALSE状态。可是有关BLOB的功能却不能同其它操作在同一个事物之中。
  例如我们在Watcom数据库中有一个称作blob_table的表其中有两个字段分别为blob_id,整型,主键;blob_col数据类型为longbinary并且将其设置为允许为空。在我们将blob写入数据库之前,我们必须将主键的值写入数据库。我们在表中加入一个新记录,blob_id的值为373,而blob_col设置为NULL。然后我们执行下面的代码:

UPDATEBLOBblob_tableSETblob_col=:lb_tot_b
WHEREblob_id=373USINGSQLCA;
IFsqlca.sqlcode$#@60;$#@62;0then
messagebox("UPDATEBLOB失败",sqlca.sqlerrtext)
ENDIF

  与UPDATEBLOB相对应的是SELECTBLOB,使用SELECTBLOB同使用SELECT INTO语句基本相同,只是这时我们操纵的是BLOB数据类型而已。例如:

bloblb_blob_var
SELECTBLOBblob_colINTO:lb_blob_varFROMblob_test
WHEREblob_id=423USINGSQLCA;

  现在您就可以通过Powerscript操纵得到的blob变量了。

  注意:您可以使用UPDATEBLOB语句修改多条记录,使这些记录有相同的值,但是您却不能使用SELECTBLOB语句得到多于一条记录。您必须使用WHERE条件确保SELECTBLOB查询到的是一行记录。您也可以将从数据库读出的blob数据写入本地的文件中,方法与读文件相似。四其它Blob字段的函数。

  此外PowerBuilder还提供了其它三个有关对Blob函数的操作: Blob(),BlobEdit()andBlobMid()。这几个函数的使用您可以查询有关的文档。


[办公软件]在sybase中插入图片、PDF、文本文件  [办公软件]安装Sybase ASE
[办公软件]linux指令大全(完整篇)  [办公软件]Linux新手入门常用命令大全
[办公软件]在RedHat Linux 9里安装gaim0.80  [办公软件]浅谈Linux 下Java 1.5 汉字方块问题解决方法
[办公软件]Linux程序员必读:中文化与GB18030标准  [办公软件]linux指令大全
[办公软件]制作Linux启动盘的四种方法  [办公软件]Linux文件系统的反删除方法
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · 办公软件  · 系统软件
    · 常用软件  · 聊天工具
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台