2.4.4 实验 2-4
【利用悲观缓冲策略实现自动增长型字段】
1. 启动Visual FoxPro 8.0。选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 2\Lab 2-4\ AutoIncField\ AutoIncField.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。
2. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择KeyInfo表,并单击右侧Browse按钮浏览其中的内容。可以看到KeyInfo表包含两个字段,Key和Value,分别用来记录表名以及主键目前应该的取值。
3. 关闭浏览窗口。
4. 选中树型结构中的Stored Procedures结点,单击右侧New…按钮,打开存储过程编辑窗口。
5. 在存储过程编辑窗口中输入如下代码,该代码建立了一个名为NewID的存储过程。注意观察其中RLOCK()函数的使用,使得先锁定、再修改、再保存、再解锁,是典型的悲观锁定方式:
FUNCTION NewID() LOCAL lcAlias, lnID, lcOldReprocess, lnOldArea lnID = 0 lnOldArea = SELECT() lcAlias = UPPER(ALIAS()) lcOldReprocess = SET('REPROCESS') *-- 锁定直到用户按下 Esc SET REPROCESS TO AUTOMATIC IF !USED("KeyInfo") USE KeyInfo IN 0 ENDIF SELECT KeyInfo IF SEEK(lcAlias, "KeyInfo", "Key") IF RLOCK() lnID = KeyInfo.VALUE REPLACE KeyInfo.VALUE WITH lnID + 1 UNLOCK ENDIF ENDIF SELECT (lnOldArea) SET REPROCESS TO lcOldReprocess RETURN lnID ENDFUNC
6. 关闭存储过程代码编辑窗口,系统询问是否保存,选择"Yes"。
7. 在左侧树型结构中选中dept表,单击右侧Modify按钮,打开Table Designer窗口。
8. 将deptid字段的Default Value设置为刚才编写的存储过程"NewID()
"。单击"OK"按钮关闭窗口,在弹出的询问窗口中选择"Yes"。
9. 单击项目管理器的Browse按钮,浏览dept表。现在表中尚没有任何记录。
10. 选择菜单 View | Append Mode,将浏览窗口的追加模式打开,这样我们就可以为该表追加记录了。在Browse窗口的department字段中输入"经管系
",并按键盘上向下移动的箭头,可以看到系统自动分配了一个数字给deptid字段,重复多次,观察主键的自动生成过程。
11. 关闭浏览窗口。
12. 选中项目管理器中的KeyInfo表,单击右侧Browse按钮,可以看到KeyInfo表中记录了Dept表主键分配到了哪一个数字。
13. 关闭浏览窗口,关闭Visual FoxPro。