您现在的位置:动易网络>> 帮助文档>> PowerBuilder>>正文内容

PB datawindow几种错误事件解析,及错误处理方法整理

  PB datawindow 几种错误事件解析,及错误处理方法整理

  在数据窗口中我发现处理错误的事件有三个

   itemerror,dberror,error不知道他们有什么区别以及什么时候触发,以下是我对这几个事件的理解,错误或者不完整的地方请各位指出和补

  充

  itemerror事件:我的理解是比如数据库里该字段是一个数字,而你却输入了字母,就会触发这事件

  dberror事件:当update(),retrieve(),嵌入sql发生错误时,触发该事件

  error事件:不知道什么时候触发?

  还有application中有一个systemerror,不知道如何触发?

  解释:

  ◆Error

  当数据窗口对象中的数据或者表达式错误时触发该事件,在分布式系统中联结发生错误时也会触发该事件。和DBError事件不同的是,该事件在

  没有和数据库交互时就有可能触发,而DBError事件触发时肯定和数据库发生了交互。通常在该事件中编写脚本,提供对错误的处理。该事件提

  供了很多参数。

  errornumber:unsigned integer类型,由PowerBuilder指定的错误代码号。

  errortext:string类型,月经推迟的原因由PowerBuilder指定的错误信息。

  errorwindowmenu:string类型www.zzhdzp.com,造成错误的脚本所在对象的父对象的名称。

  errorobject:string类型,造成错误的脚本所在的对象的名称。

  errorscript:string类型,造成错误的语句所在的脚本的全部内容。

  errorline:unsigned integer类型,造成错误的语句在其脚本中所占的行号。

  action:在Error事件下的代码执行完后,该参数取值由脚本设定。可以指定的值有:ExceptionFail!表示错误处理失败(执行该值有可能触发

  应用的SystemError事件);ExceptionIgnore!表示忽略错误继续执行(要谨慎使用该取值,因为忽略错误有可能将再次导致其他错误);

  ExceptionRetry值只能用于OLE,对于数据窗口控件,没有该取值,该取值表示再次执行刚才造成错误的功能;

  ExceptionSubstituteReturnValue!表示使用参数returnvalue的返回值,而不是返回OLE服务器或数据窗口控件的错误代码,并且取消错误状态

  。

  returnvalue:当Action指定为ExceptionSubstituteReturnValue!时返回该参数的取值。

  *对于数据窗口控件来说,如果在运算数据或属性表达式时发生了错误,将进行如下的错误处理过程:

  a.触发Error事件;

  b.如果Error事件中没有脚本或者Action变量设置成ExceptionFail!,则触发应用的SystemError事件; (exceptionignore!)

  c.如果SystemError事件下也没有脚本,便会发生应用程序错误,然后终止应用程序。

  所以,在该事件或者应用的SystemError事件下应该编写脚本。这样才不至于退出应用程序,使用户没有处理的机会,甚至录入了半天的数据连

  个保存的机会也没有了。

  返回值:该事件没有返回值,也不在该事件中使用return语句。

  ◆ItemError

  当某单元被编辑后光标要离开时,如果单元中的新数据不能通过有效性校验,则触发该事件。(同ItemChanged:当编辑完一个单元的内容而没

  有离开该单元,这时数据窗口失去焦点,这种情况不会触发该事件)该事件在ItemChanged事件之前触发,该事件触发就不能再触发ItemChanged

  事件了。该事件中的三个参数和ItemChanged事件中的三个参数完全相同。

  返回值:可以使用return语句返回任意数值, 0表示放弃修改的数据,并显示错误信息,焦点不离开该单元,该取值是缺省值;1表示放弃修改

  的数据但不显示错误信息提示,焦点不离开该单元;2表示接受刚刚修改的错误数据;3表示放弃刚刚修改的数据,并且焦点不离开该单元。

  ◆DBError

  在数据窗口控件中发生数据库错误时触发该事件。该事件有以下参数。

  SQLdbcode:long类型的错误代码,具体含义由DBMS指定。当DBMS没有指定错误代码时,SQLdbcode提供4个错误代码,-1表示事务对象参数错误

  而不能联结到数据库,-2表示不能联结到数据库,-3表示因为其他用户的修改导致用来进行检索或修改的键值在数据库中已经不存在而产生错

  误,-4表示向数据库中写blob对象时失败。

  SQLerrtext:string类型,数据库指定的错误信息。

  SQLsyntax:string类型,当错误发生时,发送到数据库的SQL语句。

  buffer:DWBuffer枚举型,表示导致错误的数据所在的缓冲区。

  row:long类型,导致错误的数据的行号。

  返回值:可以用return语句任意指定返回什么数据。有特定含义的返回值是0和1。0表示显示错误信息,1表示不显示错误信息。

  ---------------------http://topic.csdn.net/u/ 221/11/fa8ac222-81a1-4a08-ae54-22f6d6fcb651.html?

  seed=&r=#r_-------------- -----------------------

  PB数据窗口错误处理技术

  数据窗口的错误大体上可以分为两类,一类是后来用户数据输入错误导致的数据窗口错误,另一类是由于代码本身在程序运行时产生的错误。

  一个好的应用程序,不论发生哪一类错误,都不应该让应用程序停止运行,或者至少要向用户报告发生错误的情况。

  对于第1种错误,可以通过数据窗口的有效性验证提示用户重新输入数据,第2种错误则可以利用数据窗口的Error事件进行处理。

  10.9.1 数据窗口的有效性验证

  尽早发现录入数据的错误是应用程序的基本功能之一,虽然大多数数据库都支持有效性规则,但它只能在程序向数据库提交数据时才能发现数

  据存在的问题,这不仅影响应用程序的执行速度,也影响程序的健壮性。当然,与显示格式和编辑风格相似,用数据库画笔定义列的扩展属性

  时可以定义列的有效性规则,并且该规则默认地应用到数据窗口的相应列上。然而有时候需要针对具体的数据窗口定义相应的有效性规则。定

  义了有效性规则后,能够在用户移动输入焦点时就发现输入的数据是否有效。

  有效性规则实际上就是个判别值为真或假的逻辑表达式,为真(TRUE)时数据窗口接受用户输入,为假(FALSE)时显示出错信息,让用户重新输入

  数据。默认情况下,PowerBuilder用消息框(MessageBox()函数)显示出错信息,当然也能够在数据窗口控件的ItemError事件中编写程序,针对

  不同错误做出不同的处理。此外,也可以在EditChanged、ItemChanged、ItemError和ltemFocusChanged事件中编写代码,在程序中对用户输入

  的数据进行有效性验证,这样可以根据程序当时的运行状态更加灵活地判定用户输入的数据是否有效。

  1. 数据有效性规则的设定

  在数据窗口中定义数据有效性规则的步骤为:

  (1) 选择View | Column Specifications命令,弹出Column Specifications窗口,如图10-61所示。

  图10-61 Column Specification窗口

  (2) 双击要定义数据有效性规则的列Validation Expression。

  (3) 在Validation Expression文本框中输入逻辑表达式。构造表达式时,可以从Functions列表框中选取合适的函数,也能够从Columns列表框

  中选择所需的数据库列。另外,右侧的几个运算符按钮可以帮助用户把常用的运算符插入到表达式中。函数gettext()取得用户刚刚输入的数据

  ,其类型为String,如果与其他类型的数据进行比较,注意可能需要进行类型转换,如图10-62所示。

  图10-62 Modify Expression对话框

  (4) 构造好表达式后,单击Verify按钮验证表达式的正确性。正确时系统显示Expression is OK.消息框,否则系统显示出错信息,单击“确定

  ”按钮关闭消息框。

  (5) 在Validation Message文本框中输入出错提示表达式(通常为一个字符串),该表达式用于有效性规则不满足时系统的默认提示。 这样,有效性规则就设置完毕了。当用户改变了编辑控件中的内容并按下Enter键或使焦点离开该单元(通过按Tab键、使用鼠标、按上下箭头键

  )时,DataWindow会处理此数据并根据是否满足该列的要求而决定接受或拒绝这些数据。

  2. EditChanged、ItemChanged、ItemError和ltemFocusChanged事件的使用

  可以通过在EditChanged、ItemChanged、ItemError和ltemFocusChanged事件中编写代码,在程序中对用户输入的数据进行有效性验证,这样,

  可以根据程序当时的运行状态更加灵活地处理用户输入的数据。

  表10-1给出了这几个事件的触发时机。

  表10-1 EditChanged、ItemChanged、ItemError和ltemFocusChanged事件的触发时机

  事件

  触发时机

  EditChanged

  用户在编辑控件中每编辑一次便触发该事件

  ItemChanged

  当一个单元被修改并失去焦点时触发该事件

  ItemError

  当新的数据不满足列的要求时触发该事件

  ItemFocusChanged

  当列的焦点发生变化时触发该事件

  在DataWindow中,当某列的数据被修改并且该列失去焦点(例如用户使用Tab键跳到下一列)时,以上事件触发的顺序为:

  (1) 当用户输入数据时触发EditChanged事件。

  (2) DataWindow控件把编辑控件中的文本转换为列的正确的数据类型。例如,如果用户在一个数值型的列中输入文本,则DataWindow控件会把

  输入的字符转换成数字,如果不能转换,则触发ItemError事件。

  (3) 如果数据成功转换为正确的类型,则DatawWindow会使用列的有效性规则对数据进行验证,如果数据没有通过有效性规则验证,则触发

  ItemError事件。

  (4) 如果数据通过了验证,则ltemChanged事件被触发,如果在ItemChanged事件中设置了行为返回代码1,则DataWindow控件拒绝接受数据且不

  允许焦点发生变化,这种情况下,将触发ItemError事件。

  (5) 如果ltemChanged事件接受了数据,则接着触发ItemFocusChanged事件,数据作为数据项存入缓冲区中。

  图10-63说明了这一过程。

  图10-63 编辑控件中的事件触发过程

  如果数据通过了转换和验证,则ItemChanged事件被触发。默认情况下,ItemChanged事件接受数据值和允许焦点发生变化,但可以对

  ItemChanged事件编写代码来做一些额外的处理。例如,可以执行一些测试,设置一个代码拒绝接受数据,使列重新获得焦点和触发ItemError

  事件。

  下面给出一个使用ItemChanged事件的例子。在该例中,数据窗口控件dw_Employee中的ItemChanged事件中设置了返回代码,拒绝接受那些小于

  雇员年龄的数据,雇员年龄的值是在窗体的Single Line Edit或TextBox控件中指定的。

  下面是PowerBuilder中的代码:

  int in_age,age

  age=Integer(sle_age.text)

  in_age=Integer(data)

  //在ItemChanged事件中设置返回代码为1,告知PowerBuilder拒绝接受数据且不改变

  //当前的焦点

  IF in_age<age THEN RETURN 1

  10.9.2 数据窗口的错误处理

  在应用程序的执行过程中,对数据窗口的不正确的定义和设置,会触发数据窗口的错误事件(Error事件),从而导致数据窗口执行错误。在数据

  窗口中或嵌入式的SQL语句中对数据库进行不正确的存取访问以及从一个数据窗口中对多行记录进行更新操作,则会导致数据库错误,并触发

  DBError事件。

  1. 数据窗口的Error事件

  当用户使用数据窗口属性表达式及数据表达式直接访问数据窗口对象时,编译器用object这个词检查语法,对其他语法则在执行时进行检查验

  证。所以,当引用一个不存在的对象、拼错一个属性名称或引用不存在的数据时,就会在数据窗口控件中发生Error事件。

  Error事件的参数如表10-2所示。

  表10-2 Error事件参数表

  参数

  类型

  参数含义

  ErrorNumber

  unsigned integer

  错误号

  ErrorText

  string

  错误文本

  ErrorWindowMenu

  string

  发生错误对象的父窗口和菜单

  ErrorObject

  string

  发生错误的对象

  Errors cript

  string

  发生错误的全部脚本

  Errorline

  unsigned integer

  发生错误的那一行脚本

  另外,通过引用来传递动作和返回值这两个参数,可以控制这两个参数的值,并由此控制Error事件的结果。“动作”参数的类型为

  ExceptionAction,返回值可以是任意类型。Exception Action的取值有以下3个。

  ● ExceptionFail!:允许错误发生。

  ● ExceptionIgnore!:忽略错误并继续处理。

  ● ExceptionSubstituteReturnValue!:替代返回值。

  通过以下步骤可以为Error事件替代一个不同的返回值:

  (1) 把所需值赋给ReturnValue 参数。

  (2) 把ExceptionSubtituteReturnValue!的值赋给ReturnValue参数。

  如果在Error事件中没有编写程序或将动作设置为ExceptionFail!,那么就会发生应用程序的SystemError事件。PowerBuilder应用对象的

  SystemError事件是处理系统运行错误的最后一道关卡,用来处理最严重的错误,SystemError将显示出错信息并结束应用程序。可以为此事件

  编写一个脚本,以使事件的默认正常行为无效,这时可在Error对象中获得出错信息。

  2. 处理数据库错误

  数据库错误可能由一个嵌入SQL语句(静态或动态的SQL)引起,另外,在间接生成SQL语句的情况下,比如,在调用数据窗口的Retrieve()或

  Update()函数后,也可能发生错误。

  如果使用的嵌入式SQL语句发生错误,那么要检查事务对象(transaction)的SQLcode、SQLDBCode以及SQLErrText属性。注意,如果使用的是数

  据窗口函数,不要检查transaction对象的属性。

  如果使用了数据窗口,那么,在调用Update()与Retrieve()函数后应当检查函数返回值。

  (1) Update()函数的返回值

  返回1表示Update()函数执行成功,返回–1表示失败,此时DBError事件被触发。

  (2) Retrieve()函数的返回值:

  返回值≥1,表示Retrieve()函数执行成功并返回检索到记录的行数;返回–1表示函数执行失败,此时DBError事件被触发(在函数把控制权返

  回到调用脚本之前);返回0表示无数据,但DBError事件没有被触发。

  (3) ReselectRow()函数的返回值

  返回1表示ReselectRow()函数执行成功,可修改列被成功更新;返回–1表示ReselectRow()函数失败,记录行无法被重新选择。

  当数据窗口的Update()函数操作引发数据库错误时,数据窗口中的DBError事件被触发。默认情况下,系统会产生一个模式消息框显示数据库出

  错码和出错信息。

  如果不想让数据库产生的默认出错信息出现,可以在DBError事件中改变返回值,在DBError事件的脚本中写入如下语句:

  Return 1

  这个事件的参数如表10-3所示。

  表10-3 DBError事件的参数表

  事件参数

  内容 SQLDBCode DBMS提供的出错码

  SQLErrText

  DBMS提供的出错信息

  SQLsyntax

  传递给DBMS的SQL语句

  Buffer

  错误行所在的Datawindow缓存

  要注意的是,在显示一个消息框或其他模式窗口并处理错误之前,一定要完成数据库事务处理(使用ROLLBACK语句)。否则,在用户关闭消息框

  之前,事务处理会注销数据。

  此外,在更新单行记录时,任何数据库错误都与当前行相关。当更新多行记录时,用户需要知道错误所在的行。

 


感动 同情 无聊 愤怒 搞笑 难过 高兴 路过
【字体: 】【收藏】【打印文章】【查看评论

相关文章

    没有相关内容