First we try, then we trust

  博客园 :: 首页 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::
  183 随笔 :: 111 文章 :: 3133 评论 :: 358 引用

第1章实验

本章代码下载:DBApp-Lab1.rar

实验 1-1 Visual FoxPro中参照完整性的设置及数据操作顺序

【步骤1】建立索引

1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。

2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-1\RI\RI.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。

3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择student表,并单击右侧Modify按钮打开Table Designer窗口。

4. 窗口左侧有4个字段,选中id字段,并设置Index下拉列表的值为Ascending。如图 1-3:

图 1-3 选择索引顺序

5. 同样道理,选择deptid字段,并设置Index为Ascending。

6. 切换到Indexes页面,可以看到建立在字段id与deptid上的索引已经列出。从id的Type下拉列表中选择索引类型为Primary主索引。如图 1-4。

图 1-4 设置主索引

7. 切换到Table页面,观察右侧Triggers(触发器)区域内插入触发器、删除触发器以及更新触发器均为空。

8. 单击"OK"按钮,单击"Yes"按钮。

9. 在Project Manager窗口选中dept表,单击Modify按钮,打开dept表的Table Designer窗口。

10. 设置deptid字段Index为Ascending,切换到Indexes页面,设置deptid索引为Primary类型的索引,单击OK,单击Yes。

【步骤2】观察没有参照完整性约束时表的行为

11. 观察左侧树形结构中Stored Procedures结点下目前没有任何内容。

12. 选中左侧dept表,并单击右侧Browse按钮,再选中student表,单击Browse按钮,这样我们就同时打开了表dept与student的浏览窗口。用鼠标将这两个窗口排列整齐,能够同时显示在你的视线当中。

13. 在dept表的第一行左侧白色小方块中单击,使其变成黑色(这在Visual FoxPro中表示将该行逻辑删除)。用鼠标单击student表的浏览窗口使其获得焦点,观察左侧没有变黑的小方块(表示没有级联删除)。如图 1-5:

图 1-5 Dept与Student无级联删除关系

14. 切换到dept表,在黑色块上单击,使其重新变为白色(表示恢复逻辑删除的记录)。关闭两个浏览窗口。

【步骤3】设置参照完整性规则

15. 在左侧树形结构中单击选中testdb,然后单击Modify按钮,打开testdb的DataBase Designer窗口。我们可以看到在两张表的下方显示了我们建立的索引,并且主索引前面有一把小钥匙。

16. 用鼠标在dept表的deptid索引上按下并拖动到student表的deptid索引上(注意方向不要弄反,另外一定是拖动deptid索引而不是deptid字段),于是两表之间就建立起了一对多的永久性关联关系。如图 1-6:

图 1-6 建立永久性关联关系

17. 在建立起来的永久性关联关系实线上右击,并在弹出的快捷菜单中选择Edit Referential Integrity…,打开Referential Integrity Builder窗体,如图 1-7:

图 1-7 编辑参照完整性

18. 将Rules for Updating(更新规则)设置为Restrict(限制),切换到Rules for Deleting(删除规则)页面,设置成Cascade(级联),然后再切换到Rules for Inserting(插入规则)页面,设置插入规则为Restrict。单击OK按钮,在弹出的询问是否生成存储过程以及是否保留旧存储过程的消息框中选择Yes。

19. 经过短暂的生成工作后,系统询问"数据库已被修改或删除,是否重新载入?",选择Yes。

20. 关闭DataBase Designer窗口。

【步骤4】观察参照完整性约束行为

21. 依次展开左侧树型结构中的Databases | testdb | Tables,选中左侧dept表,并单击右侧Browse按钮,再选中student表,单击Browse按钮同时打开dept与student表的浏览窗口。用鼠标将这两个窗口排列整齐,能够同时显示在你的视线当中。

22. 在dept表的第一行左侧白色小方块中单击,使其变成黑色。用鼠标单击student表的浏览窗口使其获得焦点,观察系别代号为1的行左侧小方块自动变黑块,由此我们可见实现了级联删除。如图 1-8:

图 1-8 参照完整性确保了级联删除

23. 在dept表中将机械系的deptid字段值改为4后,并移动记录指针(在移动记录指针时,Visual FoxPro试图更新更新表,并触发参照完整性校验),此时会弹出一警告框,告诫无法更改Deptid字段。这是因为更新规则为"限制更新",当Student表中有学生是机械系时,就无法更改Dept表中机械系的Deptid字段值。

24. 切换到Student表,选择菜单View | Append Mode,进入追加状态,为Student输入一行新记录:Id:5,Name:和二,Age:25,Deptid:9,并移动记录指针,系统再次弹出警告框,这是因为插入规则为限制插入,我们不能插入一学生,其系号在系别表中不存在。

25. 重复上一步,将Deptid字段设置为3,观察该记录很好的插入到表当中。

【步骤5】探究Visual FoxPro参照完整性实现原理

26. 在Project Manager窗口中单击选中dept表,单击右侧Modify按钮,打开的Table Designer窗口。切换到Table页面,观察右侧Triggers(触发器)区域内更新触发器以及删除触发器中被填入了"__ri_update_dept()"与"__ri_delete_dept()",同样在student表中可以发现插入触发器以及更新触发器中被填入了"__ri_insert_student()"与"__ri_update_student()",这四个方法是对存储过程的调用,以实现刚才看到的级联删除、限制更新以及限制插入。

27. 关闭表设计器窗口。在Project Manager窗口展开左侧Stored Procedures结点,可以看到系统自动添加了多个存储过程。单击右侧Modify按钮可查看系统自动生成的程序代码。Visual FoxPro在用户执行删除(更新、插入)时会自动触发删除(更新、插入)触发器,并调用执行相应的存储过程,由存储过程实现相应的参照完整性规则校验。

28. 关闭所有窗口。

29. 关闭Visual FoxPro。

 

实验 1-2 在Visual FoxPro中实现字段级完整性约束

1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。

2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-2\ FieldValidation\FieldValidation.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。

3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择teacher表,并单击右侧Browse按钮,打开浏览窗口。

4. 试试将张三的年龄改为-5并移动记录指针,可以看到-5被保存到了数据库中。

5. 将张三的年龄改回50,并关闭浏览窗口。

6. 选中左侧teacher表并单击右侧Modify按钮打开Table Designer窗口。

7. 选中左侧的"年龄"字段,并设置右侧Field Validation中Rule为"年龄=>0.AND.年龄<=150",Message为""年龄必须是0~150之间的整数!""(注意不要漏掉里面的双引号,并且引号为半角引号)。

8. 选中左侧的"工龄"字段,并设置右侧Field Validation中Rule为"工龄=>0.AND.工龄<=50",Message为""工龄必须是0~50之间的整数!""(注意不要漏掉里面的双引号,并且引号为半角引号)。

9. 单击OK按钮关闭Table Designer窗口。

10. 单击右侧Browse按钮,打开浏览窗口,试试将张三的年龄改为-5并移动记录指针,是否仍然可以保存。再尝试将工龄改为70是否可行。

11. 关闭所有窗口。

12. 关闭Visual FoxPro。

 

实验 1-3 在Visual FoxPro中实现记录级完整性约束

1. 启动Visual FoxPro 8.0,在Command(命令)窗口中输入命令"SET EXCLUSIVE ON"并回车,该命令确保以独占方式访问表和数据库。

2. 选择菜单File | Open…,在弹出的对话框中打开SampleCode\Chapter 1\Lab 1-3\ RecordValidation\RecordValidation.pjx(若出现提示"Project has been movied…..",请按"Yes"按钮以确认路径更改)。

3. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Tables,选择teacher表,并单击右侧Browse按钮,打开浏览窗口。

4. 试试将赵六的工龄改为30并移动记录指针,可以看到数据被成功保存到表中,然而一个人工龄是不可能比年龄还大的。

5. 将赵六的工龄改回4,并关闭浏览窗口。

6. 选中左侧teacher表并单击右侧Modify按钮打开Table Designer窗口。

7. 切换到Table页面,在Record Validation下的Rule中填入"工龄=0.OR.年龄-工龄=>18",在Message中填入""只有满18岁才可以工作!""(注意不要漏掉里面的双引号,并且引号为半角引号)。

8. 单击OK按钮关闭Table Designer窗口。

9. 单击右侧Browse按钮,打开浏览窗口,试试将赵六的工龄改为30并移动记录指针,观察是否仍然可以保存。

10. 关闭所有窗口。

11. 关闭Visual FoxPro。

posted on 2005-08-06 17:58 吕震宇 阅读(3220) 评论(7)  编辑 收藏 网摘 所属分类: 数据库应用基础

评论

好象在VFP6中有点问题,两个表之间不能设置参照完整性
  回复  引用    

吕老师,问你一个问题。如果已经建立两个表之间的关系,比如学生信息表(xsxx),其中有字段叫“专业编号”;另一表为专业信息表(zyxx),存储专业编号以及专业名称。

现在要用set relation 语句来建立两表的关联。如何写命令?

  回复  引用    

步骤如下:
假设子表学生信息表(xsxx)已建好专业编号索引(zybh)
(1) 在一个工作区打开主表(例zyxx)
(2) 在另一个工作区打开子表(例xsxx)并为子表指定主控索引(zybh)
(3) 在主表工作区执行set rela to 子表主控索引标识 into 子表名
本例中:
use zyxx in 0
use xsxx in 0 order zybh
sele zyxx
set rela to zybh into xsxx


  回复  引用    

请问吕老师,如何将SQL Server 2000中的数据导入到VFP数据库中?
谢谢!

  回复  引用    

注意不要漏掉里面的双引号,并且引号为半角引号
不能加双引号么?
出现Expression is invalid。use expression for validation text property
不加里面的双引号就正常了
但是确定的时候就出现

the validation rule for field 年龄 does not evaluate to a logical or NULL type

望指教 谢谢

  回复  引用    

#6楼 2007-12-24 13:31 许涛[未注册用户]
吕老师,问你一个问题:
在编程中很容易触发参照完整性,对VFP触发机制知道的,就知道如何处理。但对最终的操作者说,这是程序的BUG。
1)如何自己定义自己的参照完整性,给出自己的提示信息
2)参照完整性的触发器中的存储代码(我读不懂),对编程人员来说可重复利用?

  回复  引用    




发表评论

昵称: [登录] [注册]

主页:

邮箱:(仅博主可见)

评论内容:

  登录  注册

[使用Ctrl+Enter键快速提交评论]

0 208983




历史上的今天:
2004-08-06 听取意见,再放一个上来
2004-08-06 欢迎大家批评
2004-08-06 献计献策
2004-08-06 出差回来了

相关文章:

相关链接: