随笔 - 6  文章 - 129  trackbacks - 0
<2024年4月>
31123456
78910111213
14151617181920
21222324252627
2829301234
567891011

常用链接

留言簿(14)

随笔档案(6)

文章分类(467)

文章档案(423)

相册

收藏夹(18)

JAVA

搜索

  •  

积分与排名

  • 积分 - 815412
  • 排名 - 49

最新评论

阅读排行榜

评论排行榜

数据窗口对象非常强大的原因之一就是能够很容易地修改数据库。当用户修改了数据窗口中的数据,插入了新的数据行或者删除了数据行以后,只要调用 update()函数就可以将修改了的数据保存到数据库中。但是,这需要一个前提,就是必须设置数据窗口的修改属性。
        数据窗口要修改数据表,首先清楚数据窗口只能修改一个数据表。当数据窗口的数据来源于不止一个数据表时,可以用脚本控制数据窗口的修改属性来对数据表逐个 进行修改,这种技术在后面有关章节介绍。下面介绍一次修改一个数据表的设定方法。
        当数据窗口是用来接受用户的手工录入数据时,应该设置两方面的属性才能确保数据窗口能够用来修改数据表。一个是修改数据窗口的修改属性,另一个是用户可以 修改的字段的相关属性值。
        首先介绍数据窗口的修改属性的设置。在数据窗口画板中,使用菜单项Rows->Update Properties,弹出如图所示的窗口。

        数据窗口的所有修改属性都集中在该窗口中。如果数据窗口对应的数据表中定义了主键或者惟一性索引,则数据窗口创建时缺省的就是允许修改,并且正确设置了所 有的修改属性。否则就需要手工进行设置。前面介绍过,当增加、删除或者重新选择了字段时,PowerBuilder将数据窗口的修改属性置为不允许,这时 也应该进行手工设置。
        首先应该选中Allow Updates选项,只有选中该选项,才允许继续进行其他属性的设定。在Allow Updates右面的下拉列表框叫做Table to Update,只能在该下拉列表框中选择一个,并且必须选择一个数据表名,选中的表就是要被更新的表。
        选中了Allow Updates属性后,接下来就要指定在数据窗口中哪些列被更新。在Updateable Columns列表框中用鼠标单击被更新的字段。当数据窗口中的字段来自不止一个数据表时,这时一定要选择同一个表中的字段,因为一个数据窗口一次只能更 新一个数据表。当数据窗口中增添了字段时,新增添的字段往往是不允许修改的,一定要在该列表框中选择该字段。
        选择了可以修改的字段后,就应该在Unique Key Columns(s)列表框中选择惟一标识一行的列。如果在定义数据表时定义了主键,单击右面的Primary Key按钮可以在该列表框中选中主键。
        Where Clause for Update/Delete组框中包含了三个选项,用来配置如何在Update和Delete SQL语句中构造where字句的。这三个选项为数据库加锁提供了三种不同的选择。当某行被选中时,用户可以通过DataWindow对象来提供完整性保 护,可以防止其他用户检索该行。这三个选项是:Key Columns、Key and Updateable Columns和Key and Modified Columns。下面分别详细介绍。

1.Key Columns
        当开发单用户应用程序或者用户都以加锁方式访问数据库时可以选中该选项。该选项表示数据窗口只使用在Unique Key Column(s)列表框中指定的惟一列进行数据更新。使用这种方式来修改数据库,并发性很高,不同的用户都可以并发地访问数据库,但是数据的完整性却非 常差。因此要保证数据完整性,只有在单用户应用程序或者加锁访问方式下才使用这种修改方式。
        例如,在add_book(通讯录)数据表中定义了5个字段,id为主键,name、address、telephone、ICQ四个字段为可修改字段, 某数据窗口包含这5个字段并且使用Key Columns更新数据库。有如下一条数据:
id:230602710327574
name:朱义
address:胜利油田
telephone:945-8557021
ICQ:39661314
假设甲用户修改了这条数据,将name改为“郭宝利”,数据窗口产生如下的UPDATE语句:
update add_book
set name = "郭宝利"
where id = "230602710327574";
其中的where字句中只包含在Unique Key Columns中指定的字段id,用该字段来确定要修改数据库中哪行数据。该update语句将成功执行。如果乙用户要将address字段修改为“冀东 油田”,甲、乙用户同时并发修改id为230602710327574的数据,都会修改成功,但会产生如下的数据:
id:230602710327574
name:郭宝利
address:冀东油田
telephone:945-8557021
ICQ:39661314
两个人同时修改了一条记录,本来地址是胜利油田的郭宝利却成了冀东油田的了。

2.Key and Updateable Columns
        这种修改方式是缺省的修改方式,它用主键列和可以修改的列来创建where子句,具有很高的数据完整性,但是并发性却不是太好。推荐使用这种修改方式。
像上面例子一样,如果甲用户做修改操作,保存数据时将产生如下的SQL语句:
update add_book
set name = "郭宝利"
where id = "230602710327574"
and name = "朱义"
and address = "胜利油田"
and telephone = "945-8557021"
and ICQ = "39661314";
该SQL语句中的where子句包含了主键id和所有的可修改字段。如果乙用户是在甲保存修改了的数据之前检索的数据,当乙用户要将address修改为 “冀东油田”时,产生如下的SQL语句:
update add_book
set address = "冀东油田"
where id = "230602710327574"
and name = "朱义"
and address = "胜利油田"
and telephone = "945-8557021"
and ICQ = "39661314";
此时,由于甲用户已经修改了数据,将name改成了“郭宝利”,所以乙用户的where子句中指定的数据在数据库中已经不存在了,乙的修改不成功,从而保 证了数据的完整性。

3.Key and Modified Columns
该方法是上面两种方法的折衷,当不同的用户并发修改同一行数据的不同字段时,都能成功修改,所以它的并发性有了一定的限制,数据的完整性比第一种修改方式 有所提高。这种修改方式使用主键和数据发生了变化的列来产生where子句。同样,在上面的例子中,甲用户要将“朱义”修改为“郭宝利”会产生如下的 SQL语句:
update add_book
set name = "郭宝利"
where id = "230602710327574"
and name = "朱义";
这时的where子句中只包含主键id和要修改的字段name。如果此时乙用户并发修改数据,要将id为“230602710327574”的用户的 address修改为“冀东油田”,乙用户也会成功修改。

4.时间标记
如果数据库管理系统支持时间标记,则可以在DataWindow对象的结果集中包含时间标记来获得最大的数据完整性。PowerBuilder将自动为更 新和删除操作的where子句加上时间标记,而不显示在可更新列的列表中。Oracle、SQL Server完全在服务器上处理时间标记,在DataWindow中不要求有额外的工作。

5.Key Modification
该组框用来指定当用户修改了主键时,数据窗口如何来更新数据表中的主键字段。有两种选择,Use Delete then Insert和Use Update。
第一个选项是先删除原有主键值,然后再使用新的主键值插入一个完整的行。使用这种更新主键的方式可以减少组织数据的工作量,但在数据库中各个数据表之间存 在父子制约关系,并且依赖该主键的外部键被指定为级联删除时,操作就不会成功的。因为级联删除方式要求当依赖主键的外部键有数据时就不能删除主键。
当DBMS允许更新主键列时,可以使用该选项,该选项直接修改主键值,所以防止了级联删除带来的操作不成功的问题。

6.Identify Column
该下拉列表框用于为下拉列表框中所指定的列(通常是主键列)生成序号,当且仅当DBMS支持序号生成时该作用才有效。
当正确进行了上述所有操作后,单击OK按钮即完成了修改属性的设置。如果数据窗口允许手工录入数据,接下来就应该设置可修改字段的相关属性了。主要包括如 下属性:
l字段的Tab Order值。
l字段的Protect属性。
l字段的DisplayOnly属性。
l字段的Visible属性。
上述属性前3个中任意一个都可以让用户无法修改字段中的数据;最后一个属性决定字段是否可见,不可见的字段不管其他属性如何设置,用户都无法修改字段中的 数据。
首先介绍如何设置字段的Tab Order值。使用菜单项Format->Tab Order可以在Design窗口显示各字段的当前Tab Order值,用鼠标单击要修改Tab Order值的字段,然后手工将Tab Order值改为非0即可。在设置Tab Order时要注意三点:
(1)用户可以手工修改的字段,其Tab Order值不能为0。
(2)在数据窗口修改属性中,不允许修改的字段其Tab Order值应该为0,或者其Display Only属性应该选中。
(3)Tab Order取值决定字段获得焦点的顺序。在数据窗口中使用Tab按钮在字段间切换时,Tab Order取值小的首先获得焦点,最大的最后获得焦点。
字段的Protect属性设置字段是否被保护。如果该属性设置为1,则不允许用户修改字段中的数据,即使Tab Order设置为非零。字段的DisplayOnly属性决定字段中的内容是否只用来显示,当属性设置为1或者True时,字段中的数据不允许用户修改, 不管其他几个属性是如何设置的。Protect属性只能使用表达式,选中字段后在属性视窗General属性中单击右侧的红色小按钮(如果已经有表达式, 则按钮为绿色),进入到表达式输入对话框,输入该属性的表达式即可。比如,设置用户不能修改字段id原来的数据,可以输入如下的表达式:
if(isRowNew(),0,1)
字段的Display属性在属性视窗Edit中,选中该选项表示该字段中的数据只用来显示,不允许用户修改。该属性不能使用表达式。在PB中,编辑类型的 控件都有该属性,并且属性的作用也是相同的。
当字段的Tab Order值为0时,肯定不能获得焦点,但是非0时也不一定能获得焦点,还得看字段的Protect属性是否设置为1;当字段的Tab Order值不为0,Protect属性不为1并且字段的Visible属性为True时,肯定可以获得焦点。DisplayOnly属性和焦点是否能够 获得无关。

来自: http://hi.baidu.com/vcvok/blog/item/9e83db1bbbf526dfad6e75cd.html


posted on 2010-08-06 15:36 Ke 阅读(7993) 评论(0)  编辑  收藏 所属分类: powerBuilder

只有注册用户登录后才能发表评论。


网站导航: