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。