null第5章 使用视图查询和修改数据第5章 使用视图查询和修改数据创建视图
使用视图
在视图中更新数据
集成视图
处理游离数据
优化视图性能
小结5.1 创建视图5.1 创建视图使用向导创建视图
创建本地视图
用已有的SQL SELECT语句创建视图
修改视图
重新命名视图
删除视图
创建多
表
关于同志近三年现实表现材料材料类招标技术评分表图表与交易pdf视力表打印pdf用图表说话 pdf
视图
访问远程数据
创建视图 创建视图 视图是VFP 6.0中为应用程序和用户提供的另一种定制的、可更新的数据集合,它具备了表和查询的特点并被保存在数据库中。
视图为用户提供了浏览、使用VFP 6.0表中数据的一种有力工具。
视图和查询有很多类似处,创建视图与创建查询的步骤相似:选择要包含在视图中的表和字段,指定与表的连接条件,指定过滤器选择特定的记录。
与查询不同的是,视图可选择如何将在视图中做的数据修改传给原始文件,或建立视图的基表。 创建视图(续)创建视图(续)创建视图时,VFP在当前数据库中保存一个视图定义,该定义包括图中的表名、字段名以及它们的属性设置。
在使用视图时, VFP根据视图定义构造一条SQL语句,定义视图的数据集合。
在VFP中,可以创建两种类型的视图:本地视图和远程视图。
本地视图利用VFP的SQL语句从表或者其他视图中选取信息;
远程视图利用远程SQL语句从远程ODBC数据源表中选取信息。
可以将一个或多个远程视图加入到本地视图中,以便能在同一个视图中同时访问VFP数据和远程ODBC数据源中的数据。 5.1.1 使用向导创建视图5.1.1 使用向导创建视图用户可以使用本地视图向导创建本地视图。
若要在ODBC数据源的表上建立可更新的视图,可以使用远程视图向导。
使用向导创建视图的步骤如下:
(1)在项目管理器中选择一个数据库。
(2)选定“本地视图”或“远程视图”,然后选择“新建”按钮。
(3)选择“视图向导”按钮。
(4)按照向导屏幕上的指令操作。 5.1.2 创建本地视图5.1.2 创建本地视图创建本地视图,可以采用以下方式之一进行:
在项目管理器中选定一个数据库,单击“数据库”符号旁的加号;选定“本地视图”,然后单击“新建”按钮,打开“视图
设计
领导形象设计圆作业设计ao工艺污水处理厂设计附属工程施工组织设计清扫机器人结构设计
器”。
在数据库已打开时,使用CREATE SQL VIEW命令显示“视图设计器”。
使用带有AS子句的CREATE SQL VIEW命令。 5.1.2 创建本地视图(续)5.1.2 创建本地视图(续)例如,可以使用以下代码创建包含dz(读者信息)表中所有字段的视图,运行结果如图5-1所示。
CREATE SQL VIEW dz-view AS SELECT *;
FROM 图书馆管理!dz图5-1 读者信息视图5.1.2 创建本地视图(续)5.1.2 创建本地视图(续)新视图的名称将显示在项目管理器中。
如果打开“数据库设计器”,会看到视图的显示方式与表在分层结构中的显示方式相同,所不同的是视图名代替了表名。
在创建视图时,如果表名前限定有数据库名,VFP将在已打开的数据库中(包括当前的和所有非当前的数据库)及默认搜索路径中寻找该表。
如果在视图定义中没有给表限定数据库名,那么在使用该视图前,数据库必须打开。 5.1.3 用已有的SQL SELECT语句创建视图5.1.3 用已有的SQL SELECT语句创建视图可以使用宏替换将SQL SELECT语句存入一个变量,再用CREATE SQL VIEW命令的AS子句来调用。
例如,下面的代码将一条SQL SELECT语句存入dz-jy变量,然后用它创建一个新视图:
dz-jy = "SELECT dz.dzxm, dz.dzbh, jy.jybh, jy.jyri;
FROM dz, jy WHERE jy.dzbh = dz. dzbh“
CREATE SQL VIEW dz-jy AS &dz-jy 5.1.4 修改视图5.1.4 修改视图使用项目管理器或命令语言,可在“视图设计器”中修改已有的视图。
若要以编程方式修改视图的SQL命令串,则必须创建新视图,保存视图定义并覆盖旧视图。
注意:用编程方式创建视图时有一个小技巧,即在“视图设计器”中,可打开一个已有的视图,复制只读的SQL字符串,并粘贴到代码中。 5.1.4 修改视图(续)5.1.4 修改视图(续)若要在“视图设计器”中修改视图,可以采用以下方式之一进行:
在项目管理器中选择视图名,再选择“修改”按钮,打开“视图设计器”。
先打开数据库,再使用带视图名的MODIFY VIEW命令。
在“视图设计器”中,可使用“查询”菜单或“视图设计器”工具栏将新表添加到视图中。
下面的代码在“视图设计器”中显示dz-view视图。
OPEN DATABASE 图书馆管理
MODIFY VIEW dz-view 5.1.5 重新命名视图5.1.5 重新命名视图可以使用项目管理器或RENAME VIEW命令重新命名视图,采用以下方式之一进行:
在项目管理器中先选择一个数据库,再选择要重命名的视图,然后从“项目”菜单中选择“重命名文件”。
使用RENAME VIEW命令。
例如,下面的代码将视图dz-view重命名为“读者视图”:
RENAME VIEW dz-view TO 读者视图 5.1.6 删除视图5.1.6 删除视图可以使用项目管理器或DELETE VIEW命令从数据库中删除视图定义。
删除视图前,包含此视图的数据库必须已打开并已设置为当前数据库。
若要删除视图,可以:
在项目管理器中先选择一个数据库,再选定要删除的视图,然后选择“移去”;
或者使用DELETE VIEW或DROP VIEW命令。
例如,下面的代码从数据库中删除dz-view视图和sj-view视图:
DELETE VIEW dz-view
DROP VIEW sj-view && ANSI SQL标准语法 5.1.7 创建多表视图5.1.7 创建多表视图要想访问存储在不同表中的相关信息,可以创建一个视图并加入两个或更多的表,或在已有的视图中加入表。
可以使用“视图设计器”或CREATE SQL VIEW命令添加表。加入表后,使用表之间定义的连接条件,进一步对视图结果进行控制。
要创建多表视图,可以指定以下方式之一进行:
在项目管理器中,创建一个视图,并在“视图设计器”中加入需要的表。
打开数据库,用CREATE SQL VIEW命令将表名及连接条件加入FROM子句中。1. 定义和修改连接条件1. 定义和修改连接条件只使用CREATE SQL VIEW命令将表加入视图,而不定义相应的连接条件,会得到表之间的“叉乘”,即表中记录的任意可能组合。
需要在语句的FROM或WHERE子句指定连接条件。只有符合连接条件的不同表中的记录才被组合在一起。
如果表间存在永久关系,将自动用作连接条件。
典型情况下,可使用由表间的主关键字和外部关键字建立的关系,定义连接条件。
在连接条件中比较它们公有的字段值(通常使用相等作为比较条件)。
例如,要查阅有关读者信息,要求包括读者的借阅信息,可创建一个由dz表和jy 表生成的视图。在这个例子中,dz表和jy表有同一字段dzbh。 1. 定义和修改连接条件(续)1. 定义和修改连接条件(续)若要在视图中定义连接条件,可以采用以下方式之一:
在项目管理器中,创建和修改视图,并在“视图设计器”中加入需要的表。
打开数据库,用CREATE SQL VIEW命令将表名及连接条件加入FROM子句。
图5-2说明了视图设计器中指定的内部连接及它在SELECT-SQL语句中的表示。图5-2 视图设计器1. 定义和修改连接条件(续)1. 定义和修改连接条件(续)以下代码创建一个如上例描述的新视图,用FROM子句指定视图的连接条件:
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 读者借阅视图AS;
SELECT * FROM dz;
INNER JOIN jy;
ON dz.dzbh = jy.dzbh 比较第1章的表1-3
(借阅信息表)可
以发现,“读者借阅
视图”的dzbh与表1-
3的dzbh排列顺序是
一致的 图5-3 读者借阅视图1. 定义和修改连接条件(续)1. 定义和修改连接条件(续)连接条件有以下几个要素:连接类型,建立连接的字段和用于连接字段的比较操作符。
在上面的例子中,连接的类型为内部连接,表读者信息的记录只有与借阅信息表的一个或多个记录相匹配,才会被包含在结果中。
若要改变视图的结果以满足特定需求,可指定:
建立连接的字段。
字段间的比较操作符。
如果视图中有两个表,须考虑连接的顺序。
连接的类型。 1. 定义和修改连接条件(续)1. 定义和修改连接条件(续)在主关键字和外部关键字以外的字段间建立连接在特定的实例中也很有用,但并不常用。
通过比较操作符,可以控制比较和返回的记录,这种方式类似于过滤器。
例如,如果连接条件中使用的是日期型字段,可选用适当的比较操作符,使得返回结果中只包括某段时间内的记录。
选择不同的连接类型,可以扩展查询结果,使结果中既包括与连接条件匹配的记录,也包括与连接条件不匹配的记录。如果视图中不止两个表,还可以通过改变FROM子句中的连接顺序改变结果。 1. 定义和修改连接条件(续)1. 定义和修改连接条件(续)可用“视图设计器”和编程语言修改视图中的连接类型。
若要修改连接类型,可以采用以下方式之一:
选择“联接”选项卡。
双击连接线。
打开数据库,用CREATE SQL VIEW 命令将表名和连接条件加入FROM 子句。 2. 在结果中包含不匹配记录2. 在结果中包含不匹配记录如果要在结果中包含不匹配的行,可用外部连接。
当使用外部连接,不匹配行的空字段将返回NULL值。以下代码生成的视图如图5-4所示。
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 读者借阅视图2 AS;
SELECT * FROM dz;
LEFT OUTER JOIN jy;
ON dz.dzbh = jy.dzbh比较图5-3和图5-4可以
发现,在图5-4中多了
没有借书的读者,例如,
读者“刘哲”。 图5-4 读者借阅视图22. 在结果中包含不匹配记录(续)2. 在结果中包含不匹配记录(续)若要控制那些包含在视图中的不匹配记录,可选择表5-1的连接类型。
表5-1 控制视图中不匹配记录可选择的连接类型 3. 定义多表间的连接条件3. 定义多表间的连接条件如果创建包含两个以上表的视图,可通过改变连接条件的顺序来改变结果。
例如,要查找有关被读者借阅的书籍的信息,可创建一个基于书籍信息表、读者信息表和借阅信息表的视图,在它们公有的字段间建立内部连接:读者信息表和借阅信息表都有读者编号字段,借阅信息表和书籍信息表都有书籍编号字段。此视图基于如下的SQL语句:
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 书籍-读者视图 AS;
SELECT * FROM sj;
INNER JOIN jy;
ON sj.sjbh = jy.sjbh;
INNER JOIN dz;
ON dz.dzbh = jy.dzbh 4. 在WHERE子句中使用连接4. 在WHERE子句中使用连接可以在WHERE子句中指定连接条件,但不能像在FROM子句的连接中那样指定连接类型。对于远程视图,连接条件通常出现在WHERE子句中。
以下代码创建的视图与前例相同,使用WHERE子句指定此视图的连接条件:
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 书籍-读者视图 AS;
SELECT * FROM sj, jy, dz
WHERE sj.sjbh = jy.sjbh AND jy.dzbh = dz.dzbh 5.1.8 访问远程数据5.1.8 访问远程数据若要使用远程服务器上的数据,可以创建远程视图。
为了创建远程视图,必须首先连接一个数据源。
1. 连接远程数据源
一个远程数据源通常是一个远程服务器,已为它在本地安装了ODBC驱动程序,并设置了ODBC数据源的名称。
为得到有效的数据源,必须在本地安装ODBC。从内部定义数据源和连接。 2. 定义连接2. 定义连接在VFP中,可以在数据库中创建并保存一个命名连接的定义,以便在创建远程视图时按其名称进行引用,而且还可以通过设置命名连接的属性来优化VFP与远程数据源的通信。
当激活远程视图时,视图连接将成为通向远程数据源的管道。
若要创建命名连接,采用以下方式之一进行:
在项目管理器中,先从“数据库”列表中选择“联接”,然后再单击“新建”按钮,打开“联接设计器”。
先打开数据库,再使用CREATE CONNECTION命令打开“联接设计器” 。
使用带有连接名称的CREATE CONNECTION命令。 2. 定义连接(续)2. 定义连接(续)例如,为了从ODBC数据源获取所需的有关信息,可以用以下代码在图书馆管理数据库中创建连接:
OPEN DATABASE 图书馆管理
CREATE CONNECTION remote_01 DATASOURCE sqlremote userid password
这时,项目管理器的“联接”中将出现remote_01。
在数据库中,创建命名连接并不会用到任何网络或远程资源,因为VFP只在使用视图时才激活连接。
在激活连接之前,命名连接只作为一条连接的定义,在数据库的.dbc文件中占据一行。当使用远程视图时,VFP根据视图中引用的命名连接,创建一个活动连接与远程数据源相连,然后将此活动连接作为管道向远程数据源发送数据请求。 3. 命名连接和数据源的使用优先权 3. 命名连接和数据源的使用优先权 在使用带有CONNECTION子句的CREATE SQL VIEW命令时,既可以使用连接的名称也可以使用数据源的名称。
VFP首先在当前数据库中搜索具有此名称的连接,如果该数据库中不存在此命名连接, VFP再根据此名称查找已建立的ODBC数据源。如果当前数据库中的命名连接与用户系统上的ODBC数据源同名,则VFP将首先查找并使用命名连接。 4. 显示ODBC注册提示4. 显示ODBC注册提示当使用一个视图而又未充分指定其连接注册信息时, VFP将显示一个与数据源相关的对话框,提示输入漏掉的信息。
在进行连接时,也可以控制VFP是否提示输入未指定的信息。
若要控制ODBC注册提示的显示,可以采用以下方式之一进行:
在项目管理器中先选择连接名,再选择“修改”按钮,打开“联接设计器”。
在“显示ODBC注册提示”区域中,选择一个选项。
使用DBSETPROP()或SQLSETPROP()函数的DispLogin属性。5. 使用已有的连接5. 使用已有的连接可以使用已有的命名连接来创建远程视图。
使用项目管理器或DISPLAY CONNECTIONS命令可以在数据库中看到一个可用连接的列表。
若要了解已有连接的情况,可在项目管理器中先选择一个数据库,然后选择“联接”;或使用DISPLAY CONNECTIONS命令。例如,下面的代码显示图书馆管理在数据库中的连接:
OPEN DATABASE 图书馆管理
DISPLAY CONNECTIONS 6. 创建远程视图6. 创建远程视图在建立了有效的数据源或命名连接之后,就可以使用项目管理器或以编程方式来创建远程视图。
远程视图与本地视图类似,只是在定义它时需要加入连接名称或数据源名称。
远程视图的SQL语句使用相应服务器上的语法。
若要创建远程视图,可以采用以下方式之一进行:
在项目管理器中选择一个数据库,选择“远程视图”,然后选择“新建”按钮,打开“视图设计器”。
使用带有REMOTE和(或)CONNECTION子句的CREATE SQL VIEW命令。6. 创建远程视图(续)6. 创建远程视图(续)如果使用了带有CONNECTION子句的CREATE SQL VIEW命令,就可以不加入REMOTE关键字
VFP根据CONNECTION关键字是否存在来判断视图是否为远程
例如,若将图书馆管理数据库中的书籍信息表放到远程服务器上,则可用下面的代码创建此表的远程视图:
OPEN DATABASE 图书馆管理
CREATE SQL VIEW书籍远程视图;
CONNECTION remote_01;
AS SELECT * FROM sj 6. 创建远程视图(续)6. 创建远程视图(续)在创建远程视图时,可以使用数据源而不使用命名连接。
在使用带有REMOTE子句的CREATE SQL VIEW命令时,也可以忽略连接名或数据源名,这时VFP将显示“选择连接或数据源”对话框,用户可以在这个对话框中选择一个有效的连接或数据源。
创建了视图后,打开“数据库设计器”,可看到视图在分层结构中与表具有相同的显示方式,只不过是视图的名称和图标代替了表的名称和图标。第5章 使用视图查询和修改数据第5章 使用视图查询和修改数据创建视图
使用视图
在视图中更新数据
集成视图
处理游离数据
优化视图性能
小结5.2 使用视图5.2 使用视图限制视图的取值范围
创建参数化视图
提示用户输入参数值
打开视图的多个实例
显示视图结构
创建视图索引
创建视图的临时关系
设置视图属性和连接属性
关闭视图的基表 使用视图使用视图视图建立之后,用户不但可以用它来显示和更新数据,而且还可以通过调整它的属性来提高性能。
处理视图类似于处理表,可以采用下列步骤进行各种操作:
使用USE命令并指定视图名来打开一个视图。
使用USE命令关闭视图。
在“浏览”窗口中,显示视图记录。
在“数据工作期”窗口中显示打开的视图。
在文字框、表格控件、表单或报表中使用视图作为数据源。 使用视图(续)使用视图(续)要使用一个视图,可以采用以下方式之一:
在项目管理器中先选择一个数据库,再选择视图名,然后选择“浏览”按钮,在“浏览”窗口中显示视图。
使用USE命令以编程方式访问视图。
下面的代码在浏览窗口中显示读者借阅视图:
OPEN DATABASE 图书馆管理
USE 读者借阅视图
BROWSE 使用视图(续)使用视图(续)一个视图在使用时,将作为临时表在自己的工作区中打开。
如果此视图基于本地表,则在VFP的另一个工作区中同时打开基表。
视图的基表是指由SELECT-SQL语句访问的表,此语句在创建视图时包含在CREATE SQL VIEW命令中。
在上面的示例中,使用读者借阅视图的同时,读者信息表和借阅信息表也自动打开。
图5-5所示为“数据工作期”对话框示例。 使用视图(续)使用视图(续)如果此视图基于远程表,则基表将不在工作区中打开,而只在数据工作期窗口中显示远程视图的名称。 图5-5 “数据工作期”对话框 5.2.1 限制视图的取值范围5.2.1 限制视图的取值范围在访问远程数据源时,很可能会访问大量数据。
可以在视图中限定被选数据的范围,以便在某一时刻只出现所需的记录,从而降低网络通信量,改善视图性能。
例如,如果想要浏览某个读者的基本情况时,可以仅下载想要的读者记录来提高性能。
一种限定视图作用范围的方法是在视图的SQL语句中加入WHERE子句。
若要查询北京读者的记录,可以创建如下SQL WHERE 子句,运行结果如图5-6所示。
SELECT * FROM dz WHERE jyzz = '北京' 5.2.2 创建参数化视图5.2.2 创建参数化视图参数化视图也可以用来限定视图的作用范围,而使用参数化视图可以避免每取一部分记录就需要单独创建一个视图的情况。
参数化视图在视图的SQL SELECT语句中加一条WHERE子句,从而仅下载那些符合WHERE子句条件的记录,其中的子句是根据所提供的参数值建立的,参数值可以在运行时传递,也可以通过编程方式传递。
对于前面的示例,可以创建一个通用视图,在需要得到某一个城市的读者记录时,只需键入相应城市的名称即可。5.2.2 创建参数化视图(续)5.2.2 创建参数化视图(续)创建参数化视图,可以采用以下方式之一:
首先打开“视图设计器”,然后从“查询”菜单中选择“视图参数”项。
使用CREATE SQL VIEW 命令并带上“?”符号和一个参数。
这个参数可以是一个VFP的表达式,计算出来的值将作为视图SQL 语句的组成部分。若计算无效,VFP将提示输入该参数值。 5.2.2 创建参数化视图(续)5.2.2 创建参数化视图(续)例如,如果将图书馆管理数据库中的读者信息表放在远程服务器上,则可用下面的代码创建一个远程参数化视图。
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 男读者视图;
CONNECTION remote_01;
AS SELECT * FROM dz;
WHERE dz.dzxb = ?dzxb
在使用这个视图时,也可以通过编程方式来提供? dzxb参数值。例如,可以输入如下代码:
dzxb = '男'
USE 图书馆管理!男读者视图 IN 0
BROWSE 5.2.2 创建参数化视图(续)5.2.2 创建参数化视图(续)这时,在男读者视图的浏览窗口中,VFP显示男读者的记录,如图5-7所示。 注意:如果参数是表达式,则用圆括号将该表达式括起来,使整个表达式被当作参数的一部分进行计算。图5-7 男读者视图5.2.3 提示用户输入参数值 5.2.3 提示用户输入参数值 如果要求输入的参数不是一个变量或表达式,那么用户也许会希望得到一个提示。
可以将字符串用引号括起来并以此作为视图参数。
若在创建视图参数时使用“?”符号,后面加上一个用单引号括起的字符串,VFP就不把该字符串看作一个表达式,而是在运行时将其作为提示,提示用户输入参数值。
例如,下面的代码创建了一个远程参数化视图,提示用户为? ‘dzxb’参数提供一个值。
OPEN DATABASE 图书馆管理
CREATE SQL VIEW 女读者视图 ;
CONNECTION remote_01 ;
AS SELECT * FROM dz ;
WHERE dz.dzxb = ?'dzxb'
USE 女读者视图 5.2.3 提示用户输入参数值(续)5.2.3 提示用户输入参数值(续)在使用上例的视图时,显示一个“视图参数”对话框,在对话框中会提示:为dzxb输入值。
在输入有效的性别值后,VFP将检索与此性别值相匹配的记录。
若在上例中输入“女”,然后浏览女读者视图,将在浏览窗口中看到相应的读者记录,如图5-8所示。 注意:使用加引
号的字符串作为
视图参数,可以
确保VFP在要求
得到参数时,总
是对用户作出提
示。 图5-8 女读者视图5.2.4 打开视图的多个实例5.2.4 打开视图的多个实例与可在多个工作区中打开同一个表一样,可以在不同的工作区中打开一个视图的多个实例。
与表不同的是:在默认情况下,每次使用视图时,都要去取一个新的数据集合。
若要在多个工作区中打开一个视图,可以采用以下方式之一进行:
在项目管理器中先选择视图名,然后单击“浏览”按钮,在“浏览”窗口中显示该视图,重复这一过程,在其他工作区中打开此视图。
在“数据工作期”窗口中,单击“打开”按钮,然后选择视图名。重复这一过程,在其他工作区中打开此视图。
使用USE命令以编程方式访问视图。5.2.4 打开视图的多个实例(续)5.2.4 打开视图的多个实例(续)在使用USE命令以编程方式访问视图时,不必重新查询数据源就可以打开视图的另一个实例。
若要不下载数据再次使用视图,可以:
在USE命令中,使用NOREQUERY子句;
或者在USE命令中,使用AGAIN子句。
下面的代码使用NOREQUERY子句,在两个浏览窗口中显示从女读者视图第一个实例中得到的临时表,而不重新查询远程数据源:
OPEN DATABASE 图书馆管理
CREATE SQL VIEW女读者视图;
CONNECTION remote_01;
AS SELECT * FROM dz
USE 女读者视图
BROWSE
SELECT 0
USE 女读者视图 NOREQUERY
BROWSE 5.2.4 打开视图的多个实例(续)5.2.4 打开视图的多个实例(续)在使用NOREQUERY子句时,可以指定一个工作期编号。
如果不指定工作期编号,VFP将对全部工作期进行搜索以查找结果集合。
若找到了打开的结果集合,就将在这个结果集合上再次打开一个临时表;若没找到打开的结果集合,则为该视图取一个新的结果集合。
和处理表一样,若未找到视图,则打开一个新的视图临时表。 5.2.4 打开视图的多个实例(续)5.2.4 打开视图的多个实例(续)如果要求VFP只在当前工作期内搜索已打开的视图结果集合,可以使用AGAIN子句。
下面的代码在两个浏览窗口中显示女读者视图:
OPEN DATABASE 图书馆管理
USE女读者视图
BROWSE
USE女读者视图 AGAIN in 0
BROWSE
在使用AGAIN子句时,VFP在当前工作期中查找一个已存在的视图临时表,并打开一个指向该视图临时表的附加别名。
打开视图的另一个实例时,使用AGAIN子句与使用属于USE的NOREQUERY子句(带当前工作期编号)等效。 5.2.5 显示视图结构5.2.5 显示视图结构若要打开一个不带数据的视图,可使用USE命令,并加上NODATA子句以编程方式访问视图。
下面的代码在浏览窗口中显示不带数据的女读者视图:
OPEN DATABASE 图书馆管理
USE 女读者视图 NODATA in 0
BROWSE 5.2.5 显示视图结构(续)5.2.5 显示视图结构(续)使用带NODATA子句的视图总会打开一个新的视图临时表。
NODATA子句是获取视图结构最快的方法,因为它在远程数据源上创建最小的临时表。
使用NODATA子句时,VFP为视图创建一个永远返回“假”值的WHERE子句。
数据源上没有记录能够匹配WHERE子句的条件,所以没有记录被选择进入远程数据源的临时表。
该视图可被快速检索,因为不必等待远程数据源去建立一个可能很大的临时表。 5.2.6 创建视图索引5.2.6 创建视图索引可以使用INDEX ON命令,为视图创建本地索引,创建过程与表一样。
与表的索引不同,在视图上创建的本地索引非永久保存,它们随着视图的关闭而消失。
注意:在决定是否要在视图上创建本地索引时,必须考虑视图结果集合的大小。对一个大的结果集合建立索引,要花费很长的时间并降低视图的性能。5.2.7 创建视图的临时关系5.2.7 创建视图的临时关系使用SET RELATION命令,可在视图索引之间或视图索引与表索引之间创建临时关系。
在使用SET RELATION命令对一个视图与一个表进行关联时,若要获得较好的性能,要在关系中设视图为父表,设表为子表。
在临时关系中,子对象必须按其索引排序。
表的结构索引是不断被维护的,因此可以快速访问;而对于视图,VFP要在视图每次激活时为其重建索引,因此很浪费时间。
如果使用数据环境,视图将不能被当作子对象,因为子对象的索引必须是定义的一部分,而视图并不支持此功能。 5.2.8 设置视图属性和连接属性5.2.8 设置视图属性和连接属性在创建一个视图时,这个视图将从环境临时表或从当前工作期的临时表0中继承属性设置,例如,UpdateType和UseMemoSize。
可以使用CURSORSETPROP()函数并以0作为临时表编号来更改默认的属性设置。
在视图建立并存入数据库之后,可使用DBSETPROP()函数修改视图属性。
在数据库中,修改的视图属性将长期保存在数据库中。 5.2.8 设置视图属性和连接属性(续)5.2.8 设置视图属性和连接属性(续)在使用视图时,数据库中保存的视图属性设置将被活动视图临时表继承。
可以使用CURSORSETPROP()函数,为视图临时表修改活动临时表的属性。
但是使用该函数进行的修改是临时的,在关闭视图后,活动视图的临时设置将消失;在结束VFP工作期时,0号临时表的临时设置也将消失。 5.2.8 设置视图属性和连接属性(续)5.2.8 设置视图属性和连接属性(续)连接也以类似方式继承属性。
当用户在数据库中创建并保存一个命名连接时,0号连接的默认属性将被继承,可以使用SQLSETPROP()函数修改0号连接的默认属性。
在数据库中创建并保存连接之后,可以使用DBSETPROP()函数修改连接属性。
在使用连接时,数据库中为连接保存的属性设置将被活动连接继承。
用户可以使用SQLSETPROP()函数并使用该活动连接的句柄来修改连接的这些属性。 5.2.8 设置视图属性和连接属性(续)5.2.8 设置视图属性和连接属性(续)视图与连接都可以使用一个有指定名称的ODBC数据源。
若在视图中使用ODBC数据源,连接将继承工作期的默认属性。
图5-9展示了视图和连接的属性继承关系。灰线代表属性继承关系,黑线代表VFP的命令。图5-9 视图属性和连接属性及其继承关系1. 下载远程视图时改变默认数据类型1. 下载远程视图时改变默认数据类型当创建视图时,视图中所有字段的DataType属性设为默认值。
对于固定长度的数据类型,用字母(D、G、I、L、M、P、T、Y)表示
对于可变长的数据类型,用字母及其后圆括号中的表示精度和范围的参数[B(D), C(N), N(N, D)]来表示。
对本地视图此属性为只读属性。
可用DBSETPROP()函数修改远程视图的字段DataType 属性的设置,如表5-2所示。2. 使用DataType属性2. 使用DataType属性可用DataType属性选择默认值以外的数据类型。
例如,要将服务器上的时间戳型字段下载到VFP中。
默认对应VFP的DataTime字段的数据类型将截断服务器时间戳中表示秒的小数部位。
可用DataType属性将远程时间戳字符映射到VFP的字符字段,以保留秒的小数部位。 5.2.9 关闭视图的基表5.2.9 关闭视图的基表在使用视图时,自动打开的本地基表并不在关闭视图时自动关闭,必须另发命令关闭它们,这与SELECT-SQL命令保持一致。 5.3 在视图中更新数据5.3 在视图中更新数据在视图中更新数据与在表中更新数据类似。
使用视图还可以对其基表进行更新。
视图在默认情况下使用开放式行缓冲,但也可以将其改为表缓冲。5.3.1 更新视图的基本操作5.3.1 更新视图的基本操作可以通过交互方式更新视图中的数据,也可以使用语言进行更新。
更新视图数据的第一步就是设置该视图为可更新。
在多数情况下,属性的默认设置将自动使视图可更新,但只有将SendUpdates属性设置为On来通知VFP进行更新时,更新信息才被发送到数据源。
视图可使用5个属性控制更新,在表5-3中列出。 表5-3 表视图更新属性及其默认设置5.3.1 更新视图的基本操作(续)5.3.1 更新视图的基本操作(续)在更新数据时,虽然以上5个属性都需要,但SendUpdates属性是其中的“主开关”,它控制了是否发送更新信息。
在应用程序的开发阶段,用户可以先关闭SendUpdates属性,设置其他属性使想要更新的字段可以被更新。
在测试应用程序时,可以打开SendUpdates属性允许发送更新数据流。 5.3.1 更新视图的基本操作(续)5.3.1 更新视图的基本操作(续)在一些复杂情况下,默认的更新设置可能不支持用语言创建的视图进行更新。
若要使其能够更新数据,必须检查每个更新属性的默认设置,并根据需要调整它们。
也可以根据需要,指定附加的属性,例如,UpdateType、WhereType等。
若要在“视图设计器”中使视图可更新,可在“视图设计器”中,选择“更新条件”选项卡并检查默认设置。 5.3.1 更新视图的基本操作(续)5.3.1 更新视图的基本操作(续)通过“视图设计器”创建的视图,默认设置通常允许视图被更新,用户所需要做的只是选中“发送SQL更新”复选框来打开更新开关。
如果愿意,还可以修改表、字段、SQL WHERE子句和更新选项。
若要通过设置视图更新属性使视图可更新,可以使用DISPLAY DATABASE命令检查当前默认设置,然后使用DBSETPROP()函数,根据需要修改视图的属性。 5.3.1 更新视图的基本操作(续)5.3.1 更新视图的基本操作(续)以编程方式指定5个视图更新属性的步骤:
(1)对Tables属性至少设置一个表名。
例如,如果有一个表为kcb(课程表)表,基于此表有一个为kcb_view视图,可以使用以下函数设置表名:
DBSETPROP('kcb_view', 'View', 'Tables', 'kcb')
(2)用一个或多个本地VFP字段名来设置KeyField属性,这些字段名的组合可作为这个可更新表的惟一关键字。
对于上例,可以用以下代码使kcbm成为关键字段:
DBSETPROP('kcb_view.kcbm', 'Field', 'KeyField', .T.) 5.3.1 更新视图的基本操作(续)5.3.1 更新视图的基本操作(续)(3)利用UpdateName属性,在视图字段与基表字段之间建立映射关系。当视图是根据具有共同字段名的两个表之间的连接建立起来的时,或者当字段在视图中有别名时,这个属性尤其有用。
DBSETPROP('kcb_view.kcbm', 'Field', 'UpdataName', 'kcb.kcbm')
(4)指定要用UpdateField属性进行更新的字段范围。只能指定已包括在UpdateName属性中的字段。
DBSETPROP('kcb_view.kcbm', 'Field', 'Updatable', .T.)
(5)设置SendUpdates属性为“真”(.T.)。这是一个主开关,它允许VFP将创建的更新信息发送到可更新表和可更新字段中。
DBSETPROP('kcb_view', 'View', 'SendUpdates',.T.) 5.3.2 在视图中更新多个表5.3.2 在视图中更新多个表可以在一个视图中更新多个表。若视图组合了两个或多个表,那么设置相应属性,使得只有视图查询中一对多关系的“多”方可被更新。
视图的更新是对表进行的。对于视图访问的每一个表,其关键字段集合无论对视图结果集合还是对基表都是惟一关键字。
若要使一个多表视图可更新,可以:
在“视图设计器”中,选择“更新条件”选项卡,再选择需要更新的表和字段名;
或者使用DBSETPROP函数。
在多数情况下,VFP的默认值允许多表视图可更新,即使是对于以编程方式创建的多表视图也是如此。 5.3.3 用数据字典定制视图5.3.3 用数据字典定制视图视图存于数据库中,用户可以对视图创建下列内容:
标题。
视图注释及视图的字段注释。
视图字段的默认值。
字段级和记录级规则及规则的错误信息。
视图的数据字典在功能上与数据库表中的相应部分非常相似。
用户必须以语言方式而不能用表设计器为视图创建标题、注释、默认值和规则。 5.3.4 为视图字段创建默认值5.3.4 为视图字段创建默认值与表的字段默认值相似,视图的字段默认值存于数据库中,并且在每次使用视图时都可用。
VFP并不对本地创建的默认值与远程数据源创建的默认值相比较,但用户创建的默认值必须能让数据源接受。
若要给视图字段指定默认值,可以:
在“视图设计器”的“字段”选项卡中,选定一个字段,并选择“属性”,输入字段的默认值;
或者使用DBSETPROP()函数的DefaultValue属性。
下面的示例创建了一个默认值为2的xf字段:
USE kcb_view
? DBSETPROP('kcb_view.xf', 'Field', 'DefaultValue', '2') 5.3.5 在视图的字段和数据行上创建规则5.3.5 在视图的字段和数据行上创建规则对远程数据源规则创建相应的本地版本,可以带来以下好处:
减少响应时间。
减轻网络资源的压力。
在向远程数据源发送数据前,先进行测试。
避免向远程数据源发送错误数据。
VFP并不将本地创建的规则与远程规则进行比较,用户必须保证创建的规则可被数据源接受。
如果远程规则有所更改,本地规则也必须随之更改。 5.3.5 在视图的字段和数据行上创建规则(续)5.3.5 在视图的字段和数据行上创建规则(续)若要在视图字段或记录上创建规则,可以:
在“视图设计器”的“字段”选项卡中,选定一个字段,并选择“属性”,输入字段的表达式规则及规则提示信息文本;
或者使用DBSETPROP()函数的RuleExpression和RuleText属性。
例如,下面的代码对kcb_view视图创建了字段级规则,防止输入的ks小于16:
OPEN DATABASE 成绩管理
USE kcb_view
DBSETPROP('kcb_view.ks', 'Field', 'RuleExpression', 'ks >= 16')
DBSETPROP('kcb_view.ks', 'Field', 'RuleText', ' "ks must be greater than or equal to 16" ')
也可以使用DBSETPROP()函数创建数据行级规则。 5.4 集成视图5.4 集成视图可以在其他视图的基础上再创建视图。
理由是:有时需要从多个其他视图中获取一部分信息,或者需要将本地和远程数据集成到单个视图中。
一个基于视图的视图,或基于集成了本地表、本地视图或远程视图的视图,称为多级视图。
集成了其他视图的视图,称为顶层视图。
在顶层视图与本地基表或远程基表之间,可以有多层次的视图。
在使用多级视图时,顶层视图所基于的视图和各级视图的VFP基表将出现在“数据工作期”窗口中,远程表不会出现在“数据工作期”窗口中。 5.4.1 在视图中集成本地数据和远程数据5.4.1 在视图中集成本地数据和远程数据通过创建基于本地视图和远程视图的新本地视图,可以在一个视图中集成本地数据与远程数据。
若要创建集成本地数据与远程数据的视图,可以:
在项目管理器中先选择一个数据库,再选择“本地视图”,然后单击“新建”按钮,打开“视图设计器”,在视图中加入表、本地视图或远程视图;
或者直接使用CREATE SQL VIEW命令。
例如,可以使用如下代码创建一个集成了本地xk表和远程kcb表中信息的本地视图:
OPEN DATABASE 成绩管理
CREATE SQL VIEW remote_kcb_view ;
CONNECTION remote_01 ;
AS SELECT * FROM kcb
CREATE SQL VIEW local_xk_remote_kcb_view ;
AS SELECT * FROM 成绩管理!local_xk_view, ;
成绩管理!remote_kcb_view ;
WHERE local_xk_view.kcbm=Remote_kcb_view.kcbm5.4.2 在视图中更新本地数据与远程数据5.4.2 在视图中更新本地数据与远程数据在多级视图中更新数据时,更新将向下延续一层视图。
如果要更新多级视图的基表,则必须为多级结构中的每一个视图都发送一条TABLE UPDATE命令。5.5 处理游离数据5.5 处理游离数据使用游离数据功能,可以用与主数据库相连接的视图建立数据的子集,这样就脱离了主数据库对游离数据进行操作。
可以直接访问视图,也可以通过应用程序访问,之后,还可以将数据上载回主数据库。
在下面这些情况下,可以使用游离数据:
(1)数据大量存放在一个地方。
(2)用于地理位置较远的情况。
(3)与时间有关的数据。 创建和使用游离视图数据创建和使用游离视图数据可用下列函数或命令创建和使用游离视图数据:
CREATEOFFLINE()函数
带有ADMIN 和ONLINE子句的USE SQL ViewName命令
TABLEUPDATE函数
DROPOFFLINE()函数
如果要在创建游离视图的计算机以外的机器上使用此视图,必须在这台机器(目标机)上建立主数据库文件(.DBC)的拷贝,确认目标机上的视图使用了ODBC数据源,并分析数据需求以决定所需的视图内容。 5.5.1 创建游离视图5.5.1 创建游离视图和用联机数据一样,在创建游离视图前,应分析需求以决定所需要的视图设计。
确定了脱机使用的数据子集之后,就可使用已有的视图或是创建新视图。
如果已有视图返回的记录正是脱机操作时想要的,则可直接使用它;否则就需要以编程方式创建视图。
游离视图中包含的数据存储在本地机数据库的一个.DBF文件中。5.5.1 创建游离视图(续)5.5.1 创建游离视图(续)若要使用已有的游离视图,可使用CREATEOFFLINE()函数和视图的名称。
例如,如果要添加学生、增加新的课程、需要当前选课信息,可以建立一个名称为stuinfo的视图,组合了来自xsb表、xk表和kcb表的信息。可用下列代码创建视图:
CREATEOFFLINE("stuinfo")
若希望以编程方式创建游离视图,可使用CREATE SQL VIEW命令,跟之以CREATEOFFLINE()命令。
例如,以下代码创建一个游离视图,用于显示来自联机数据库中xsb表和xk表中的数据。由于没有指定更新条件,因此视图是只读的。
CREATE SQL VIEW showxsb;
CONNECTION dsource;
AS SELECT * FROM xsb INNER JOIN xk;
ON xsb.xh=xk.xh
CREATEOFFLINE("showxsb") 5.5.2 显示和修改游离数据5.5.2 显示和修改游离数据为游离数据创建了视图后,就可以在应用程序中像使用其他视图一样使用这些视图:添加、修改、删除记录。
多个用户可以以共享模式同时访问同一数据库中的游离视图。
如果不想保留对游离数据的任何修改,可以恢复信息重新反映原始信息。1. 使用游离数据1. 使用游离数据使用游离数据视图,可以像使用联机视图那样使用表单、报表或应用程序来显示和更新数据。
例如,以下代码打开Showxsb视图:
USE Showxsb
注意:如果在游离视图中没有得到所需的数据子集,可检查远程视图的优化设置。
如果使用DBSETPROP()函数设置了MaxRecords属性,则视图中最多只能包含设置的记录数。
如果在视图的字段列表中包含一个备注字段,则即使将FecthMemo设置为“否”(.F.),该备注字段也将自动包含在结果集合中。 2. 管理游离数据2. 管理游离数据在一些情况下,尤其在多用户环境中,很多人会同时操作相同的数据,在把游离数据更新到源数据库之前,可能希望检查一下那些被改动过的数据。
使用带有ADMIN子句的USE命令,可以查看对游离数据的所有修改,还可以有选择地放弃一些还没有与数据源相连接的那些修改。
例如,以下代码在管理员模式下打开Showxsb视图:
USE Showxsb ADMIN 5.5.3 更新联机数据5.5.3 更新联机数据处理完游离数据后,就可以更新服务器中的数据。
更新的方法与使用表更新事务处理程序更新联机数据相同。注意:
对于更新单个记录,使用自动事务处理。
对于批处理更新,使用人工事务处理。
必要时,添加代码用以检测更新冲突,创建冲突记录,解决冲突。
在进行更新之前,需要用USE命令和ONLINE关键字重新与主机数据库连接,VFP用存储在视图中的数据源信息确定主机数据库的位置。联机建立后,可用TABLEUPDATE()函数处理游离数据中的更新。
为确保连接信息的正确,不用考虑主机或视图表的位置,需使用连接字符串语法,而不是命名的连接。 1. 在本地表中更新多批记录1. 在本地表中更新多批记录要处理对本地表的批量修改,可使用人工事务处理,它允许在一个事务处理中处理整批记录。
以下代码实现用游离视图更新本地表。
USE myofflineview ONLINE EXCLUSIVE
BEGIN TRANSACTION
IF TABLEUPDATE(2, .F., "myofflineview")
END TRANSACTIONELSE
ELSE
MESSAGEBOX("Error Occurred: Update unsuccessful.")
ROLLBACK
ENDIF 2. 在远程表中更新多批记录2. 在远程表中更新多批记录处理对远程表的批量修改,使用人工事务处理,从TABLEUPDATE()开始,以SQLCOMMIT()或SQLROLLBACK()结束过程。
为了设置可用人工方式管理事务的连接,需要对视图临时表使用CURSORGETPROP()函数,以得到连接句柄,然后设置手动模式的Transaction属性。
在以下代码中,视图myview的当前连接标识存储在hConnl中。hConnl将Transaction属性设为“2”-人工事务处理。
hConn1 = cursorgetprop("connecthandle", "myview");
SQLSETPROP(hConn1, "transactions", 2)
设置了处理更新的连接后,可用TABLEUPDATE()函数处理事务。 3. 更新一个记录3. 更新一个记录如果要更新单独一行,可使用自动事务处理。
每个进行更新的语句、删除或插入的语句都以独立的事务进行处理,不可能重新运行前面的事务处理。
USE xsbview ONLINE EXCLUSIVE
GO TO 3
IF TABLEUPDATE(0, .F., workarea)
… && 处理冲突代码
ENDIF
注意:可用GETNEXTMODIFIED()函数更新本地表中的单独一行。 4. 取消游离数据的更新4. 取消游离数据的更新如果决定删除游离数据并恢复联机视图,可使用带有视图名的DROPOFFLINE()函数。
如果返回值为“真”(.T.),表明成功;否则表明在命令发出前,视图没有关闭。
以下代码放弃对myview视图中数据子集的全部修改。视图仍是数据库部分,但放弃了当前的数据。
DROPOFFLINE("myview")
注意:可以删除游离数据,但不能对游离视图使用pack、zap或insert命令。 5.6 优化视图性能5.6 优化视图性能通过设置视图属性,可以优化视图性能。
5.6.1 控制递进式获取信息量大小
通过视图和活动视图临时表的FetchSize属性,可以控制每次递增的从远程数据源所取的数据行数量。
属性的设置可以利用DBSETPROP()和CURSORSETPROP()函数来完成。 5.6.2 控制备注字段的获取5.6.2 控制备注字段的获取利用VFP延迟取备注字段的功能,可以加速视图数据的检索。
在选择了延迟取备注字段这一功能之后, VFP将不检索备注字段的内容,而等到选择打开并显示这一字段时才检索。
VFP需要关键字段和表名来定位在远程数据上的数据行,若要实现延迟取备注字段,必须设置UpdateName或UpdatableFieldlist属性、KeyField或KeyFieldlist属性及Tables属性。
并不需要设置SendUpdates和Updatable属性为ON状态。 5.6.3 设置下载的最大记录数5.6.3 设置下载的最大记录数可以通过设置属性来控制打开视图时下载的数据量。
当向VFP数据源发送一条SQL语句来创建视图时,数据源将建立并保存一个结果集合,MaxRecords属性将指定从远程结果集合取入视图的最大行数。
默认的设置为-1,即下载结果集合的全部数据行。 5.6.3 设置下载的最大记录数(续)5.6.3 设置下载的最大记录数(续)控制下载至视图的数据行