First we try, then we trust

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

2.4.5 实验 2-5

【用Visual FoxPro验证WHERE短语生成策略】

【步骤1】在SQL Server中建立数据库

1. 从Windows开始菜单中选择 程序 | Microsoft SQL Server | 企业管理器,启动SQL Server 2000的企业管理器。

2. 在企业管理器中新建一个名为"DBApp"的数据库。关闭企业管理器。

3. 从Windows开始菜单中选择 程序 | Microsoft SQL Server | 查询分析器,启动SQL Server 2000的查询分析器,并登录连接到当前SQL Server数据库上。

4. 在查询分析器中选择 文件 | 打开…,打开SampleCode\Chapter 2\Lab 2-5\SQL-GenDB\ GenDBApp.sql。

5. 观察GenDBApp.sql中的SQL命令,注意其中的建表命令包含了一个timestamp类型的version字段,这就是我们的时间戳字段。

CREATE TABLE [dbo].[Student] (
   [id] [int] IDENTITY (1, 1) NOT NULL ,
   [name] [varchar] (8) COLLATE Chinese_PRC_CI_AS NULL ,
   [age] [int] NULL ,
   [dept] [varchar] (10) COLLATE Chinese_PRC_CI_AS NULL ,
   [version] [timestamp] NULL 
) ON [PRIMARY]

6. 从查询菜单中选择"执行",执行当前脚本。当前脚本将在新建的DBApp数据库中建立一名为Student的表并输入4笔数据。

7. 关闭查询分析器。

【步骤2】观察Visual FoxPro中的远程视图配置

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

9. 在出现的Project Manager窗口中选择Data页面,依次展开左侧树型结构中的Databases | testdb | Remote Views,选择StudentView并单击右侧Browse按钮浏览其中的内容。该远程视图将访问本地SQL Server的DBApp数据库,并读取student表中的内容。如果无法正常访问,请自行修改树型结构Connections结点下的ConnDBApp数据库连接,确保能够访问本地SQL Server的DBApp数据库。

10. 关闭浏览窗口。单击右侧Modify按钮打开StudentView视图的设计器。切换到Update Criteria页面,如图 2-16:

图 2-16 studentview的Update Criteria页面

11. 观察左下角的"Send SQL updates"复选框已被勾选,表示视图将通过发送SQL命令的方式对远程数据源进行更新。

12. 观察中间部分,钥匙图标对应列表示关键字,id字段被勾选,表示id字段是关键字段。铅笔对应列表示可更新字段,name与age被勾选,表示只有name与age字段上的修改才会被保存,其它字段上的修改不会提交数据库保存。

13. 观察右侧"SQL WHERE clause includes"单选按钮,一共有4种更新策略,我们在后面将分别观察这4种策略所产生的SQL命令。

14. 观察右侧"Update using"单选按钮,提供了两种更新方式,一种是先删除再插入的更新方式,另外一种是发送UPDATE命令进行更新。我们选择了发送SQL UPDATE命令。

15. 关闭StudentView视图编辑窗口。

【步骤4】观察不同更新策略生成的SQL命令

16. 从Windows桌面上单击开始按钮,依次选择 程序 | Microsoft SQL Server | 事件探察器,启动SQL Server的事件探察器。

17. 在事件探察器窗口中选择 文件 | 新建 | 跟踪…,在出现的登录窗口中选择Windows身份验证并单击确定(也可以根据情况输入你的用户名与密码进行登录)。

18. 在出现的跟踪属性窗口中直接单击运行按钮开始事件跟踪。如图 2-17:

图 2-17 事件跟踪窗口

19. 注意不要关闭事件跟踪窗口,切换回Visual FoxPro窗口,在Project Manager窗口中选择Documents页面,展开Forms,选中updatecriteria表单并单击右侧Run按钮。如图 2-18:

图 2-18 UpdateCriteria表单运行界面

20. 切换回事件探察器窗口,可以看到事件探察器已经探察到Visual FoxPro的动作,它执行了一条SQL命令"SELECT Student.id, Student.name, Student.age, Student.dept, Student.version FROM dbo.Student Student ORDER BY Student.id"。如图 2-19:

图 2-19 事件探察器探察到了Visual FoxPro执行的命令

21. 切换回Visual FoxPro窗口,注意观察当前WHERE短语生成策略为"关键字"。将网格中第一行记录的姓名"张三"改为"张三*",并点击"保存"按钮。

22. 切换到事件探察器窗口,可以看到事件探察器探察到了Visual FoxPro发来的UPDATE命令:"exec sp_executesql N'UPDATE dbo.Student SET name=@P1 WHERE id=@P2', N'@P1 varchar(8),@P2 int', '张三* ', 1",这可能和我们以往看到的UPDATE命令稍有不同,是通过存储过程调用实现的更新。不过我们还是可以看出在UPDATE命令的WHERE短语中只有一个"id=@P2",其中的@P2是参数,其值可以在命令最后找到是1。因此我们说该更新命令的WHERE短语只包含了关键字。

23. 切换回Visual FoxPro窗口,选中"关键字和已修改字段" 单选按钮,然后将网格中第2行的姓名"李四"改为"李四*",并点击"保存"按钮。

24. 切换到事件探察器窗口,这次事件探察器探察到的UPDATE命令如下:"exec sp_executesql N'UPDATE dbo.Student SET name=@P1 WHERE id=@P2 AND name=@P3', N'@P1 varchar(8),@P2 int,@P3 varchar(8)', '李四* ', 2, '李四 '",可以看出在UPDATE命令的WHERE短语中包含了关键字和已修改字段"WHERE id=@P2 AND name=@P3"。

25. 切换回Visual FoxPro窗口,选中"关键字和可更新字段" 单选按钮,然后将网格中第3行的年龄从21改为25,并点击"保存"按钮。

26. 切换到事件探察器窗口,这次事件探察器探察到的UPDATE命令如下:"exec sp_executesql N'UPDATE dbo.Student SET age=@P1 WHERE id=@P2 AND name=@P3 AND age=@P4', N'@P1 int,@P2 int,@P3 varchar(8),@P4 int', 25, 3, '王五 ', 21",在WHERE短语中包含了关键字和所有可更新字段(name与age字段)"WHERE id=@P2 AND name=@P3 AND age=@P4"。

27. 切换回Visual FoxPro窗口,选中"时间戳"单选按钮,然后将网格中第4行的姓名"赵六"改为"赵六*",并点击"保存"按钮。

28. 切换到事件探察器窗口,本次更新UPDATE命令如下:"UPDATE dbo.Student SET name='赵六* ' WHERE id=4 AND version=0x00000000000008EB",在WHERE短语中包含了关键字和时间戳字段version。每次更新时间戳都会自动发生变化。

29. 切换回Visual FoxPro窗口,将"赵六*"重新改回"赵六",并单击"保存"按钮。这次系统提示"更新失败!"。思考一下为什么。

30. 切换到事件探察器窗口,查看刚才发送过来的SQL命令为"UPDATE dbo.Student SET name='赵六 ' WHERE id=4 AND version=0x00000000000008EB",注意其中的时间戳version字段的值仍然是"0x00000000000008EB",与前两步命令中的时间戳的值相同。然而在上次更新后,时间戳已经发生了变化,不再是"0x00000000000008EB"了,因而导致了更新失败。

31. 切换回Visual FoxPro窗口,单击"刷新"按钮,重新从数据库中读入数据。再次将"赵六*"改回"赵六",并单击"保存"按钮。这次系统不再提示更新失败。

32. 切换到事件探察器窗口,这次的UPDATE命令为"UPDATE dbo.Student SET name='赵六 ' WHERE id=4 AND version=0x00000000000008F4",注意其中的时间戳的值发生了变化。

33. 关闭事件探察器窗口,关闭Visual FoxPro。

posted on 2005-08-19 23:14  吕震宇  阅读(3089)  评论(1编辑  收藏  举报