PB改变数据窗口更新特性的方法.doc_第1页
PB改变数据窗口更新特性的方法.doc_第2页
PB改变数据窗口更新特性的方法.doc_第3页
PB改变数据窗口更新特性的方法.doc_第4页
PB改变数据窗口更新特性的方法.doc_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

改变数据窗口更新特性的方法 打开一数据窗口,从Rows菜单中选择的Update Properties系统显示Specify Update Prorerties对话框: A、 如果不允许数据窗口更新数据库,那么就不要选中复选框Allow Updates,单击OK按钮关闭对话框。如果要禁止用户修改数据窗口的某列,那么在数据窗口画笔中将此列的TabOrder值设为0。 B、 如果允许数据窗口更新数据库,选中复选框Allow Updates。 C、 在Table To Update下拉列表框中选择要更新的表 D、 在Where Clause For Update/Delete中选则更新方式。 E、 在Updatesble Cloumns通过单击选择可更新的列,被选中的列将加亮显示。 F、 选择了要更新的列后,在Unique Key Column(s)列表框中定义唯一键,这个唯一键必须能够在表中唯一的标识一条记录。 G、 在Key Modification组框中选择当唯一键列更新时数据行的更新方式。 H、 如果当前表中包括了自动增长序号的列(称做标识列,并非所有的数据库都具备此特性),那么在Indentity Column下拉列表框中指定该列。 I、 单击OK关闭对话框。 注意事项:如果在Indentity Column下拉列表框中指定某列为标识列,那么就不要把该列选择为可更新列。否则,如果把该列选择为可更新列,那么数据窗口产生的任何更新数据库的Update语句都将失败。 关于Specify Update Prorerties对话框中的Key Modification组框的详细意义。Key Modification组框中两个选项指定当唯一键列被更新时的数据行的更新方式。 A、 选中Use Delete Then Insert单选钮,在唯一键列被更新的情况下,PoweBuild将首先删除原来的行,然后使用新的键值插入新行。(这种方法减少了数据库重新组织数据的次数,但也存在一些潜在的问题,当某个表的主键是另一个表的外键并在定义外部键时将删除方式定义同时删除(级联删除)时,应用程序可能并不想使用Use Delete Then Insert选项。) B、 选中Use Update单选钮,在唯一键列被更新的情况下,PoweBuild修改行的键值(并非所有的数据库都支持主键更新,也就是说,如果您使用的数据库管理系统不支持主键更新,在这里您就不能选择Use Update选项)。这种方法避免了与外部键相关的级联删除问题。 关于Specify Update Prorerties对话框中的Where Clause For Update/Delete的三个选项的具体含义: A、 Key Columns 当选中Key Columns单选钮时,数据窗口只使用Unique Key Columns列表框中选择主键来构造here子句,该选项经常在单用户应用程序环境中使用,当PowerBuild生成Update或 Delete语句时,它比较某行键值列的原始值与数据库相应行键值列的值,如果两者相等,则更新操作或删除操作被成功的执行。 B、 Key and Updateable Columns 当选中Key and Updateable Columns单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值与可更改列的原始值与数据库的相应值进行比较。当这些值相等时,修改或删除相应的行(即Update或Delete语句成功执行)。 C、 Key and Modified Columns 当选中Key and Modified Columns单选钮时,PowerBuild在创建的Update或Delete语句中将键值列的原始值和已修改可更改列的原始值与数据库的相应值进行比较。当这些值相等时,修改或删除相应的行,该选项是对数据完整性的保护和操作并发性的折中。 查看文章PowerBuilder程序中的并发控制2008-11-23 20:32并发能力是指多用户在同一时间对相同数据同时访问的能力。一般的关系型数据库都具有并发控制的能力,但是这种并发功能也会对数据的一致性带来危险。试想若有两个用户都试图访问某个银行用户的记录并同时要求修改该用户的存款余额时,情况将会怎样呢?我们可以对PowerBuilder中的DataWindow进行设置来进行并发控制。所谓并发控制就是指在用户数据修改的过程中保证该数据不被覆盖或改变的方式,在下面的例子中我们将看到如何设置DataWindow来控制开发访问。公司的某员工在银行前台取款2,000元,银行出纳查询用户的存款信息显示银行存款余额20,000元;正在这时,另一银行帐户转帐支票支付该帐户5,000元,机器查询也得到当前用户存款20,000元,这时银行的出纳员看到用户存款超过了取款额,就支付了客户2,000元并将用户存款改为18,000元,然后银行的另一名操作员根据支票,将汇入的5,000元加上,把用户的余额改为25,000元,那么数据库管理系统是否可以接受这些修改呢?在DataWindows的设计中,我们选择菜单RowsUpdate,会出现Specify Update Characteristics的设置窗口,在这个窗口中我们设置Update语句中Where子句的生成,以此来进行开发控制。在这里有三个选项,我们分别看一看在本例中这三个选项的结果:(1)Key Columns:生成的Where子句中只比较表中的主键列的值与最初查询时是否相同来确定要修改的记录。在上述的例子中,转帐支票的操作将覆盖出纳员做出的修改,这样银行损失两千元。(2)Key and Updateable Columns:生成的Where子句比较表中主键列和可修改列的值与最初查询时是否相同。在上例中两次查询出的结果都是有两万余额,当第一个人修改余额时,余额仍是二万元,所以修改成立,而支票转帐操作时余额已不是二万,所以该列不匹配,修改失败。(3)Key and Modified Columns:Where子句比较主键和将要修改的列,在本例中,结果与Key and Updateable Columns的选择相同,因为余额已改变,不再与最初的查询相同,因此仍然不能修改。让我们作另外一个假设,我们把银行后台作支票转帐操作改为冻结用户存款,即把状态字段的值改为冻结,而且事件发生的次序如下面例子所述,前台出纳的修改能不能成立呢:(1).Key Columns:Where子句只比较主键值,显然出纳员的修改是允许的。(2).Key and Updateable Columns:生成的Where子句包括比较所有可修改的列,因此出纳修改时Statue字段为冻结与出纳查询时的tive不符,修改失败,同时显示错误信息。(3).Key and Modified Columns:Where子句的比较包括主键和要修改的列,由于本列中修改列仍为20,000元没有变化,所以出纳的修改可以成立。在本例中,我们可以看到Key and Updateable Columns的选项最严格,可以避免出现状态列发生改变时余额作修改的错误,但是这也会禁止我们作一些本当允许的并发修改,如出纳修改存款余额,而业务员修改用户的联系地址等。因此我们应当根据实际情况,选择适当的Update设置。根据我们使用数据库的不同,我们还有一些其他的控制并发访问和修改的选择方案,如对数据加锁。锁是一个用户避免其他用户对指定行作修改的操作。在结束一个事务如执行commit,rollback,disconnect等语句时自动将锁释放。如果您使用的DBMS支持锁的操作,在Power-Builder的DataWindow设计时,Select语句可在from子句中加上with holdlock:即在data Window的SQL Window中,在表窗口的标题处点击右鼠标,弹出菜单的最后一个选项即为Holdlock。选择该项,生成的SQL语句将在retrievel()函数执行后将所查询的数据加锁,以避免其他用户的修改访问,直至commit,rollback等事件发生后解锁。这种方式带来的问题是,当用户查询完数据后可能离开计算机长时间不用,这段时间内其他用户均无法修改数据。此外有些DBMS如Sybase等不支持行级锁,也就是说当你对某一行查询时更多的行都被上了锁,这就更增加了并发处理的局限性。另一个值得注意的问题是在多窗口应用中某一个窗口的事务提交将会导致使用一事务中其他数据窗口的查询行解锁,这时修改将可能发生错误。某些DBMS系统支持一个称作时间戳(timestamp)的数据项来控制并发性。每张表中都有一个时间戳的数据列,当Insert语句或Update语句对数据行作修改时该列自动被修改为当前时间。当你要作修改时,where子句可检查时间戳列在查询时和修改时两个值是否相符,以此来确保您做出的修改不会覆盖别人的修改,因此这种确认方式与key and Updateable Columns选项相同。即使两个用户对同一行的不同列作修改,笠桓鲂薷恼咭步 堋诔玫墓叵敌褪 菘庵蠸ybase和Microsoft的SQL Server支持时间戳的使用。而在PowerBuilder中,不管用户后台连接何种数据库,只要表中带有timestamp的列名且数据类型为datetime,PB将自动忽略Update characteristics的选项,而在where子句中生成主键和时间戳列的比较。如果您所用的数据库不支持时间戳但支持触发器,您也可以在表中增加一列整数型的列。当有对表中某种记录作修改时,该列自动加1。下列使用的是Watcom数据库,对Shipper表增加Updcnt字段并作两个触发器,这样任何用户或进程试图修改某行记录时,该字段均可发生变化。 对INSERT触发器的编写如下:DROP TRIGGER INSSHIPPER CREATE TRIGGER SHIPPER BEFORE INSERT ON SHIPPER REFERENCING NEW AS Newvalue FOR EACH ROW BEGIN SET newvalue.UpdCnt=newvalue.UpdCnt+1; END同理可编写UPDATE触发器。在您的PowerBuilder应用之中,除表的主键外,必须再加上这一列作为检测列加入Update语句中的Where子句中,这样再作Update操作时,后台数据库会比较修改时与用户作Retrieve操作时数据是否相等,以确认是否能作修改。在DataWindows中在Specify Update Characteris-tics的对话框的右下角的Unique key column(s)中加上Updcnt一项,同时注意where clause中选择Key columns,这样PowerBuilder在构造where子句时就会认为Updcnt亦是表的主键,而成为检测项。当数据窗口的Update函数被调用后,触发器将修改过记录中的Updcnt列表为新值,为保证下一次修改能够有效,您应当立即作Retrieve()以使DataWindow缓冲区中Updcnt的值与数据库相同。显然修改后立即查询的代价要比其他任何一种并发控制的代价要小得多。一、引言对于Client/Server方式下的编程,不可避免地有并发操作处理的问题。为了说明问题,举一个不够恰当的例子:如果有两个用户A和B都试图访问同一员工记录并同时要求修改该员工工资时,会有什么情况发生呢?假设该员工的工资为1000元,两台机器修改记录之前读出用户工资均正确。A用户为此员工加本月奖金200元,查询到原来薪水为1000,加上200后变为1200,而此时B用户在不同的机器上扣除此员工的水电费50元,系统将salary字段置为950,显然这种修改是不能接受的,实际的结果应该是1150元。DataWindow是PowerBuilder中一个独特的对象,功能强大,是Sybase的专利技术,它可以方便而快速地处理数据。通过数据窗口,我们无需编写复杂的SQL语句,就可以实现对数据库的读写操作。实际上DataWindow 在更新数据时,会根据用户对 DataWindow 中的数据进行的各种操作自动地转换成 SQL 语句,然后再执行。例如:用户新增了一条记录,也就是脚本执行了InsertRow() 函数,输入数据后保存(调用 Update() 函数),此时 PB会将其自动转换成 SQL 语句,发送到数据库服务器。对于转换后的SQL语句,我们可以在datawindow的sqlpreview事件中,加脚本:MessageBox(SQL语句,sqlsyntax)来查看。这里有一点需要注意,如果数据库连接的binding参数设定为enable,则sqlsyntax返回将不完整,插入一条记录时sqlsyntax呈如下形式:INSERT INTO personnel ( id, name, birthday, technical_post, salary, notes ) VALUES ( ?, ?, ?, ?, ?, ? )为了正确返回sqlsyntax,需将binding参数设为disabled, 设置方法是在dbprofile对话框中,将transaction标签页的Disable Bind选项勾上,或者是在personnel.ini文件中DbParm改为:DbParm=Connectstring=DSN=database_server,DisableBind=1 则sqlsyntax完整返回如下:INSERT INTO personnel ( id, name, birthday, technical_post, salary, notes ) VALUES ( 100, 令狐冲, 1975-05-01, 工程师, 1000, 软件开发 )三、PowerBuilder中的并发控制PowerBuilder中可以通过数据窗口的更新属性(Update Properties)来实现并发控制。打开 DataWindow 画笔板,点击 Rows-Update Properties菜单,进入“Specify Updatae Properties”对话框,其中“Where Clause for Update/Delete”组合框中的三个选项就是三种处理数据并发问题的策略。 1、选项“Key Columns”: 这种情况是比较更新前后Table的关键字是否发生了变化,即当前数据库中关键字的实际值和最初查询的值做比较,如果没有改变,则可以更新,反之不能更新。如用户A将员工号为100的职员的salary字段值改为1200并保存后,B用户也将员工号为100的职员的salary字段值改为950并点击“存盘”按钮,我们可以看到数据窗口sqlpreview事件中的sqlsyntax返回如:UPDATE personnel SET salary = 950 WHERE id = 100 因为关键字id=100没有发生变化,Where条件成立,更新成功,将A用户的修改覆盖,salary值变

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论