ccidnet????

出版日期:2002-10-09 总期号:1158 本年期号:75

本期导读
电脑工程师
客户机/服务器结构中的双向数据传递

孙柏林

  客户机/服务器结构(简称C/S结构)是网络计算理论中的重大技术创新,相对传统的主机集中模式和文件服务器模式而言,C/S结构的优点十分明显。目前两层C/S或多层C/S结构技术在数据库应用领域中得到广泛的运用。

  C/S结构的优点之一是能够减少网络流量,提高事务处理速度。在一项具体的事务处理过程中,通过数据传递,客户机和数据库服务器以及中间应用服务器分别按照各自的职责范围合理地分担了相应的处理工作,协同完成事务处理,从而提高了处理速度。因此为了充分发挥C/S结构的优点,必须设计出灵活高效的双向数据传递方式。本文讨论在PowerBuilder和MS SQL SERVER开发环境中,C/S两端数据传递的几种模式及其特点。

  PowerBuilder(通常简称PB)是SYBASE公司开发的面向对象可视化开发工具,自90年代初推出至今,深受广大软件开发人员的青睐,几乎成为数据库开发工具的代名词;MS SQL SERVER是MicroSoft公司在大型数据库领域中的核心产品,目前已得到广为应用。PB和SQL SERVER之间可以通过ODBC方式、JDBC方式、OLE DB方式以及MS SQL Server6.x专用数据接口方式进行网络互联,其中专用数据接口方式更能充分发挥SQL SERVER强大的数据管理功能。PB要向SQL SERVER传递数据、命令或参数,提出服务请求;同时SQL SERVER要将执行结果返回PB。PB提供了多种模式实现与数据库服务器之间的双向数据传递。


  模式一 数据窗口模式


  使用PB的DataWindow Painter工具可以创建各种风格以及各种类型数据源的数据窗口。数据窗口是一个功能强大、复杂同时又十分方便的窗口对象,它可以直接向数据库服务器传递SELECT语句或请求执行存储过程。既可以向数据库端传入查询参数也可以不传入参数,可以返回多行记录。

  数据窗口模式有两个突出优点。一是可以充分利用PB所特有的 DataWindow用户界面的强大功能,减少编程工作量;二是可以返回多行记录,非常适宜于报表设计,尤其是一些计算过程复杂的报表,可以先调用存储过程进行计算,然后通过DataWindow返回计算结果。


  模式二 嵌入SQL语句模式


  在PB中可以直接使用嵌入式SQL语句,包括SELECT、INSERT、DELETE、UPDATE等基本数据操纵语句,传入参数以及返回结果可以直接通过PB变量进行,仅仅需要在PB变量前增加一个冒号,使开发人员感觉和在数据库环境下写SQL语句没有什么不同。

  嵌入SQL语句模式的优点是使用直观方便,缺点是SELECT语句不能返回多行记录数据。


  模式三 动态SQL语句模式


  有些SQL语句比如DDL语句不能通过嵌入式SQL实现,另外有些SQL语句的格式和参数在设计编译时无法确定,必须在模块执行时才能确定,在这些情况下,PB提供了一种动态SQL技术,开发人员根据各种情况将需要执行的SQL命令生成一个字符串变量或常量,以字符串形式提供给数据库服务器动态分析编译处理。

  根据是否需要提供输入参数和是否返回运行结果集四种不同组合情况,PB有四种动态SQL语句格式分别与之相对应。以格式一为例:

  例1.

  execute immediate "create unique index idx_dep_depno on dep (depno) ";

  该行代码在表dep上建立一个唯一性索引,SQL命令存放在一个字符串常量之中。在PB程序只能通过该方式直接执行这种DDL型的SQL命令。

  例2.

  string ls_sql_statement,ls_depno

  ……

  ls_sql_statement = "delete dep where depno='"+ls_depno+"'"

  execute immediate : ls_sql_statement ;

  该段代码删除dep表中部门编号为指定值的某一行记录,SQL命令根据程序执行情况临时生成相应的删除命令,存放于一个字符型变量中,然后发送到数据库服务器请求执行。

  其它三种格式可以进行更为复杂的处理,能够调用服务器端的存储过程(stored procedure),能够利用游标(cursor)方式逐行获取数据。动态SQL命令模式的优点是能处理各种在编程时无法确定的DDL和动态DML语句,使得编程灵活性提高,缺点是执行效率略微降低。


  模式四 远程过程调用模式


  有些比较复杂的数据计算处理过程必须通过在服务器端设计存储过程来解决,开发人员希望在PB中调用这些存储过程,并将过程的执行结果返回到PB变量之中,针对这种要求,PB提供了一种远程过程调用模式。远程过程调用的使用和外部API函数在形式上相似,但只能在事务型用户对象中以局部外部函数Local External Function形式进行定义。由于事务对象是一个全局型对象,开发人员可以随时调用这个局部外部函数。

  这种局部外部函数可以通过函数返回值或传址型参数两种方式将存储过程执行结果返回到PB中,因此在编程形式上可以按照面向对象的方式进行封装处理。

  举例说明: 假设在SQL SERVER中有一个存储过程名为“usp_tongji”,其功能是对一定日期期间内某部门的业务发生的次数进行统计,该过程有三个输入参数,一个输出参数,则定义格式为:function long uf_tongji(string depno,string startdate,string enddate,ref long cnt) RPCFUNC ALIAS FOR "dbo.usp_tongji"

  通过远程过程调用模式调用服务器端的存储过程,可以充分利用DBMS自身的许多优点,执行效率高,SQL SERVER7.0以上甚至支持一些面向对象特点的存储过程,比如几个存储过程名称相同,但允许参数个数类型不同。该模式的另一突出优点是编程形式与外部API函数调用完全一致,程序的可读性、可维护性较好。

  除了上述四种模式外,还有一种通过PB的全局事务对象返回计算结果的方式。SQLCA的几个属性分别反映访问了最新的SQL操作的执行结果:SQLCode表示执行是否成功;SQLNRows表示操作所影响记录的个数;SQLErrText表示操作执行过程中DBMS发出的错误信息,是一个字符型变量,开发人员通过RAISERROR命令可以在存储过程或触发器中根据处理情况产生相应的用户自定义错误信息,通过SQLCA的SQLErrText属性返回给PB。

  在软件开发过程中,综合使用上述各种模式,可以设计出灵活、高效的软件产品。