当前位置:首页 > 作文大全 > 基于PowerBuilder的嵌入式SQL编程 plc编程入门梯形图
 

基于PowerBuilder的嵌入式SQL编程 plc编程入门梯形图

发布时间:2019-01-11 04:01:47 影响了:

  摘要:针对嵌入式SQL编程技术,本文论述了如何在PowerBulider语言中实现嵌入式SQL编程技术,详细描述了技术的原理及具体实现的细节,并给出相应的编程实例代码。
  关键词:PowerBlider;嵌入式SQL;通信区;游标
  中图分类号:TP311文献标识码:A文章编号:1009-3044(2007)18-31679-02
  The Programming Technology of Embedded SQL Base on PowerBuilder Language
  QIN Fei-zhou
  (Academy of Physics and electricity Information,University of Ningxia, Yinchuan 750021, China)
  Abstract:The programming technology about Embedded SQL, we have dicussed the form of Embedded SQL base on PowerBuilder language in this paper. We have not only discussed the principle of technology and described the realization detail, but also produced the corresponding programming example code.
  Key words:PowerBuilder; The Embedded SQL; communication; cursor
  
  1 引言
  
  标准SQL是非过程化的查询语言,具有操作统一、面向集合、功能丰富、使用简单等多项优点。但和程序设计语言相比,高度非过程化的优点同时也成了它的一个弱点。因为他缺少流程控制能力,难以实现应用业务中的逻辑控制。
  为了解决这一问题,将SQL嵌入到某种高级语言(例如PowerBuilder)中使用,利用高级语言的过程性程序结构来完成逻辑控制。这种方式下使用的SQL语言称为嵌入式SQL(Embedded SQL)。通过嵌入式SQL可提高应用系统和关系数据库管理系统(RDBMS)间的互操作性。
  应用系统中使用SQL编程来访问和管理数据库中数据的方式主要有:嵌入式ESQL(Embedded SQL,ESQL)、PL/SQL(Procedural Language/SQL)、ODBC(Open Data Base Connectivity)编程、JDBC(Java Data Base Connectivity)编程和OLEDB(Object Linking and Embedding DB)编程等方式。本文主要论述如何在PowerBuilder语言中实现嵌入式SQL编程。
  
  2 基于PowerBuilder语言的嵌入式SQL
  
  2.1 嵌入式SQL在PowerBuilder中的标识
  嵌入式SQL是将SQL语句嵌入程序设计语言中,被嵌入的程序设计语言PowerBuilder称为宿主语言,简称主语言。
  RDBMS一般采用预编译方法处理ESQL,即由RDBMS的预处理程序对源程序进行扫描,识别出ESQL语句,把它们转换成主语言调用语句,以使主语言编译程序能识别它们,然后由主语言的编译程序将纯的主语言程序编译成目标代码。
  在ESQL中,为了能够区分嵌入式SQL语句与主语言语句,所有SQL语句都必须加一个标识。在PowerBuilder中的每一个SQL语句结束处加上一个分号“;”作为区分标识。
  2.2 嵌入式SQL语句与PowerBuilder之间的通信
  将SQL嵌入到PowerBulider语言中混合编程,SQL语句负责操纵数据库,高级语言语句负责控制程序流程。这时程序中会含有两种不同计算模型的语句,它们之间应该如何通信呢?PowerBuilder提供了一种非可视事务对象(Transaction Object),用于主语言与数据库的连接,即它是应用程序和数据库之间的通信区域。
  在PowerBuilder应用程序中,如果要连接和操作数据库,则必须首先建立事务对象。事务对象的属性分为两大部分,一部分是连接数据库的参数,另一部分则接收返回的数据库操作状态信息。每个事务对象有15个属性,其中有10个属性用于数据库的连接,5个属性用于接收数据库返回的操作状态信息(成功或失败)。具体内容如下表所示。
  2.3 事务对象的使用方法
  事务是操作数据库的基本单位,事务对象是操作数据库的基本工具。PowerBulider使用一个叫做逻辑工作单元(Logical Unit of Work,简称LUW)的数据库事务处理基本概念。LUW是事务的同义词,一个事务是由一条或多条SQL语句构成的一个LUW。在一个事务内,所有的SQL语句作为一个整体,要么全部执行成功,要么全部执行失败。
  在PowerBuilder中有四条管理事务的语句,它们是CONNECT、COMMIT、DISCONNECT、ROLLBACK。
  CONNECT语句用来建立到数据库的连接,同时标志着一个事务的开始。在CONNECT语句之前,相应的事务对象必须存在,并且连接数据库所需要的事务对象的属性必须已经赋值。DISCONNECT语句首先结束当前的事务,然后断开与数据库的连接。所有的SQL语句肯定都是在CONNECT语句和DISCONNECT语句之间执行的。COMMIT语句是提交事务,就是确认当前事务对数据库所做的修改,它标志着一个事务已经结束,并且开始一个新的事务。ROLLBACK语句的功能是撤消事务,也就是撤消当前事务对数据库所做的修改,使数据库恢复到当前事务修改数据库之前的状态。撤消了一个旧事务,也标志着开始了一个新事务。
  PowerBuilder提供了一个默认的全局事务对象SQLCA(SQL Communication Area,简称SQLCA),开发人员可以使用这个默认的事务对象建立到数据库的连接。一个事务对象连接一个数据库,如果应用程序需要同时操作多个数据库,则必须建立另外的多个数据库事务对象。使用事务对象操作数据库包括以下步骤:
  (1)为事务对象连接数据库的属性赋值。
  (2)连接到数据库。
  (3)将事务对象赋值给DataWindow控件或DataStore对象。
  (4)执行数据库操作。
  (5)断开与数据库的连接。
  如下的程序段是同时操作两个数据库的实例,其中默认的事务对象SQLCA用于Adaptive Server Anywhere数据库,而非默认的事务对象MSSTrans 用于Microsoft SQL Server数据库:
  //设置默认事务对象的属性
  SQLCA.DBMS="ODBC"
  SQLCA.Database="EAS Demo DB V3"
  SQLCA.AutoCommit=False
  SQLCA.DBParm="ConnectString="DSN=EAS Demo DB V3;UID=dba;PWD=sql""
  //连接到Adaptive Server Anywhere数据库
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   CONNECT USING SQLCA;
  //说明和建立事务对象MSSTrans
  TRANSACTION MSSTrans
  //设置事务对象MSSTrans的属性
  MSSTrans=CREATE TRANSACTION
  MSSTrans.DBMS="MSS"
  MSSTrans.Database="library"
  MSSTrans.ServerName="SERVER"
  MSSTrans.AutoCommit=False
  MSSTrans.DBParm=""
  //连接到MS SQL Server数据库
  CONNECT USING MSSTrans;
  //插入一行到Adaptive Server Anywhere数据库中的department表
  INSERT INTO department values(600,"computer",501) USING SQLCA;
  //插入一行到MS SQL Server数据库中的itemlist表
  INSERT INTO itemlist VALUES("500","网络工程","501")USING MSSTrans;
  //断开与Adaptive Server Anywhere数据库的连接
  DISCONNECT USING SQLCA;
  //断开与MS SQL Server的连接
  DISCONNECT USING MSSTrans;
  //释放事务对象MSSTrans
  DESTROY MSSTrans;
  3 游标的使用
  3.1 为什么要用到游标
  SQL是面向集合的,一条SQL语句可以产生或处理多条记录。而主语言是面向记录的,一组主变量一次只能存放一条记录。所以仅使用主变量并不能完全满足SQL语句向应用程序输出数据的要求,为此嵌入式SQL引入了游标(Cursor)的概念,用游标来协调这两种不同的处理方式。
  游标是系统用户开设的一个数据缓冲区,存放SQL语句的执行结果,每个游标区都有一个名字。用户可以通过游标逐一获取记录,并赋给主变量,交由主变量进一步处理。
  3.2 游标的操作
  在PowerBuilder中使用游标有四个基本的步骤:声明游标、打开游标、提取数据、关闭游标。
  3.2.1 声明游标
  在PowerBuilder中使用游标和使用其它类型的变量一样,使用之前首先应当声明它。游标的声明包括两个部分:游标的名称和这个游标所用到的SQL语句。如要声明一个叫作CustomerCursor的游标用以查询地址在北京的客户的姓名、帐号及其余额,可以编写如下代码:
  DECLARE CustomerCursor CURSOR FOR
  SELECT acct_no,name,balance
  FROM customer
  WHERE province="北 京";
  我们还可以动态地定义游标中的Where子句的参数, 例如在上例中我们是直接定义了查询省份是北京的记录,如果在应用中我们要使用一个下拉式列表框,由用户来选择要查询的省份,那么在DECLARE的Where子句中加入变量作参数即可完成这个功能,编写代码如下:
  DECLARE CustomerCursor CURSOR FOR
  SELCECT acct_no,name,balance
  FROM customer
  WHERE province=:ls_province; //定义ls_province的值
  在游标的声明中有一点必须注意:如同其它变量的声明一样,声明游标的这一段代码行是不执行的,因此不能将debug调试时的断点设在这一行代码上,也不能用IF…END IF 语句来声明两个同名的游标,如下列的代码就是错误的。
  IF ls_province ="北 京"THEN
  DECLARE CustomerCursor CURSOR FOR
  SELECT acct_no,name,balance
  FROM customer
  WHERE province="北 京";
  ELSE
  DECLARE CustomerCursor CURSOR FOR
  SELECT acct_no,name,balance
  FROM customer
  WHERE province <> "北 京";
  END IF
  3.2.2 打开游标
  声明了游标后在作其它操作之前,必须打开游标。打开游标是执行与其相关的一段SQL语句,例如打开上例声明的一个游标,我们只需编写如下代码: OPEN CustomerCursor;。
  由于打开游标是对数据库进行一些SELECT的操作,它将耗费一段时间,时间的耗费主要取决于使用的系统性能和这条语句的复杂程度。
  3.2.3 提取数据
  当用OPEN语句打开了游标并在数据库中执行了查询后,不能立即使用在查询结果集中的数据,而是必须用FETCH语句来取得数据。一条FETCH语句一次可以将一条记录放入指定的主变量中。事实上,FETCH语句是游标使用的核心。在数据窗口(DataWindow)和数据存储(DataStore)中,执行了Retrieve()函数以后,查询的所有记录结果一次全部可以得到;而使用游标,则可以逐条得到记录查询结果,应用程序就可以逐条处理结果集中的所有记录数据了。
  已经声明并打开一个游标后,我们就可以将数据放入任意的变量中。在FETCH语句中可以指定游标的名称和目标变量的名称。如语句FETCH CustomerCursor INTO:ls_acct_no, :ls_name, :ll_balance;就是将游标取出的记录中acct_no字段内容放入主变量ls_acct_no中,将name字段内容放入主变量ls_name中,将balance字段内容放入主变量ll_balance中。
  从语法上讲,上面所述的就是一条合法的取数据的语句,但是使用游标却还应当包括其它的部分。正如前面所谈到的,游标只能一次从后台数据库中取出一条记录,而在多数情况下,我们所想要做的是在数据库中从第一条记录开始提取,一直到结束,所以需要将游标提取数据的语句放在一个循环体内,直至将结果集中的全部数据提取后,结束循环。 通过检测SQLCA.SQLCODE的值,可以得知FETCH语句是否成功。当SQLCA.SQLCODE值为0时表明一切正常;100表示已经取到了结果集的末尾;而其它值均表明操作出了问题,据此可以编写以下的代码:
  (上接第1680页)
  lb_continue=True //用来控制循环,初值为真可以执行循环体
  ll_total=0 //用来统计取出的记录数
  DOWHILE lb_continue
  FETCH CustomerCur-sor INTO:ls_acct_no, :ls_name, :ll_balance;//取出记录到主变量中
  If sqlca.sqlcode=0 Then
  ll_total+=ll_balance //如果成功取出,记录数目加1
  Else
  lb_continue=False //否则表示操作有问题,停止取出记录
  End If
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文   LOOP
  循环体的结构有多种,这里提到的是最常见的一种。也有的程序员喜爱将一条FETCH 语句放在循环体的前面,循环体内再放置另外一条FETCH语句,并检测SQLCA.SQLCODE是否为100。但是这样做,维护时需同时修改两条FETCH语句,稍麻烦了些。
  3.2.4 关闭游标
  在游标操作的最后请不要忘记关闭游标,这是一个好的编程习惯,以使系统释放游标占用的资源。关闭游标的语句如下: CLOSE CustomerCursor;
  3.3 游标的高级技巧
  尽管目前基于SQL语句的后台数据库所支持的语言都大致相同,但对游标的支持却有着一些差异,例如对滚动游标支持。所谓滚动游标,含义是程序员可以指定游标向前或向后任意一个方向滚动。如在Informix中,可以将游标滚向结果集开头(FETCH FIRST)或末尾(FETCH LAST),回滚到前一条记录(FETCH PRIOR)滚向下一条记录(FETCH NEXT)。 当程序员用FETCH语句,其缺省是指FETCH NEXT。由于滚动是在数据库后台实现的,所以滚动游标为用户编程提供了极大的方便。
  对游标支持的另一个不同是可修改游标。上述游标的使用都是指只读游标。而象Oracle、Sybase数据库支持可作修改的游标。如果使用的数据库是Sybase,必须修改数据库的参数,将游标可修改的值修改为1(SQLCA.DBParm="Cursor Update=1"),才能执行上述操作,这个修改在连接数据库的前后进行均可。使用这样的数据库,可以修改或删除当前游标所在的行。例如修改当前游标所在行的用户的余额,可进行如下编码:UPDATE customer SET balance=1000 WHERE CURRENT of customerCursor;删除当前行的编码如下:DELETE FROM Customer WHERE CURRENT OF CustomerCursor;。
  
  4 结束语
  
  数据窗口是PowerBuilder中的进行数据操作的一个可视化控件,通过数据窗口可以完成对数据库的所有操作,而且数据窗口也是PowerBuilder最突出的特色之一。但在PowerBuilder中不仅可以通过数据窗口操作数据库,也可以在PowerScipt中直接使用SQL语句操作数据库。通过前面的分析我们可以得出结论,PowerScript支持标准嵌入式SQL语句和动态SQL语句,并且编程更加灵活方便。
  
  参考文献:
  [1]王姗, 萨师煊. 数据库系统概论(第四版)[M]. 高等教育出版社, 2006,5.
  [2]高守传, 刘小静. 使用嵌入式SQL访问数据库[J]. 电脑编程技巧与维护, 2007(2).
  [3]吴飞, 王昕. 嵌入式移动数据库SQL SERVER for Windows CE的应用[J]. 微计算机信息, 2006,(17).
  [4]张继德, 史宝英. PowerBulider大型结果集的处理[J]. 电脑知识与技术, 2006(11).
  [5]罗杰里. SQL SERVER数据库中的后台连接与应用[J]. 科技经济市场, 2006(1).
  [6]崔巍. PowerBuilder7.0应用技术[M]. 清华大学出版社, 2000.9.
  注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文。
本文为全文原貌 未安装PDF浏览器用户请先下载安装 原版全文

猜你想看
相关文章

Copyright © 2008 - 2022 版权所有 职场范文网

工业和信息化部 备案号:沪ICP备18009755号-3