-
关于记录和表缓冲问题
一.设置文件锁定和缓冲
您可以为多用户应用程序指定下列文件锁定和缓冲选项。
?
若要允许或禁止自动文件锁定,在“锁定和缓冲”区中,
选定或清除“文件自动锁定”复选框。或者,
使用
SET LOCK
命令。
?
若要允许或禁止多个记录锁定并确定缓冲方式:
1.
在“锁定和缓冲”区中,选定或清除“多个记录锁定”复选框。
2. <
/p>
如果选定了“多个记录锁定”
,从“缓冲”框中选择缓冲方法。或
者,使用
SET
MULTILOCKS
命令并用
CURSORSETPROP(
)
函数设置
Buffering
属性。
?
若要为失败的文件或记录锁定操作设置重新处理的方法,在“重新处理”框中,选择重新处理的方法。
或者,使用
SET
REPROCESS
命令。
二
.
设置远程视图默认值
对于远程数据访
问,您可以使用“选项”对话框中的“远程数据”选项卡或
CURSORSETPROP( )
函数,为视
图设计器和连
接设计器指定下列设置。
?
若要
允许或禁止共享连接,在“远程视图默认值”区中,选定或清除“共享连接”复选框。或者,用
< br>
CURSORSETPROP( )
函数设置
ShareConnection
属性。
?
若要允许或禁止应请求取备注字段,在“远程视图默认值”区中,选定或清除“取备注字段”复选框。或
者,用
CURSORSETPROP(
)
函数设置
FetchMemo
属性。
?
若要定义
SQL
更新方法:
1.
在“条件”框中,选择更新条件。
2.
在“方法”框中,选择更新方法。或者,用
CURSORSETPROP( )
函数设置
WhereType
和
UpdateType
属性。
?
若要指定每次取的远程记录的数目,在
“每次取的记录数”
框
中,
键入或选择记录的数目,
或者选定
“全部”
复
选框。或者,用
CURSORSETPROP( )
函数设置
FetchSize
属性。
?
若要指定每次要取记录的最大数目,在
“要取的最大记录数”
框中,
键入或选定记录的数目,
或选定
“全部”
复
选框。或用
CURSORSETPROP( )
函数设置
< br>MaxRecords
属性。
?
若要指定需使用备注字段时的字段大小,在“长度
>=
右值时使用备注字段”框中,键入或选择字符的数
目。或者,用
CURSORSETPROP(
)
函数设置
UseMemoSize
属性。
?
若要指定批处理更新的远程记录数目,在“成批更新的记
录数”框中,键入或选择记录的数目。或者,
用
CURSORS
ETPROP( )
函数设置
BatchUpdateCount
属性。
三
.
修改远程数据访问选项
您可以使用“
选项”对话框中的“远程数据”选项卡,或使用下表所列的等价命令,为视图设计器和连接设计器
设置远程数据访问选项。远程数据选项卡中的选项
等价命令:
共享连接
CURSORSETPROP(
取备注字段
CURSORSETPROP(
SQL
Update
:条件
CURSORSETPROP(
SQL
Update
:方法
CURSORSETPROP(
每次取的记录数
CURSORSETPROP(
要取的最大记录数
CURSORSETPROP(
使用备注字段
CURSORSETPROP(
成批更新的记录数
CURSORSETPROP(
异步执行
SQLSETPROP(
显示警告信息
SQLSETPROP(
批处理
SQLSETPROP(
自动事务处理
SQLSETPROP(
显示注册信息
SQLSETPROP(
连接超时设定
SQLSETPROP(
空闲超时设定
SQLSETPROP(
查询超时设定
SQLSETPROP(
等待时间
SQLSETPROP(
四
.CURSORSETPROP(
)
函数
指定
Visual FoxPro
表或临时表的属性设置。
第
1
页
共
8
页
语法:
CURSORSETPROP(cProperty
[, eExpression] [, cTableAlias | nWorkArea])
参数:
cProperty
:指定要设置的表或临
时表属性。请注意,对
Visual FoxPro
表只能指定
Buffering
属
性。
eExpression
:为
cProperty
属性指定值。如省略
eExpression
,属性设为默认值。
下表列出可为
cProperty
指定的属性以及能指定的
eExpression
值。
属性
eExpression
值:
BatchUpdateCount
发送到缓冲表后台的更新语句数目。
1
是默认值,调整该值可以
大大提高更新性能。
Buffering
1
设置行缓冲和表缓冲关闭,
在
FoxPro
早期版本中,
锁定记录和写数据的操作是等价的
(默
认值)
;
2
打开保守式行缓冲;
3
打开
开放式行缓冲;
4
打开保守式表缓冲;
5
打开开放式表缓冲。除了方式
1
之外,
SET MULTILOCKS
都必须是
ON
。
FetchMemo
FetchSize
.T.
视图结果中包含备注字段。
.F.
视图结果中不包含备注字段。
从远程结果集合中逐步提取的行数,默认值是
100
行。
FetchSize
设为
-1
将检索全部结果
集(但受
MaxRecords
设置限制)
。
KeyFieldList
逗号分隔的临时表主字段的列表。
无默认值。必须包含字段名的列表。
MaxRecords
当结果集返回时所提取的最大行数。默认值是
1
(返回所有行)
。
0
值指定执行视图,但不提
取结果。
SendUpdates
.T.
执行
SQL
更新查询以更新远程表。
.F.
不执行
SQL
更新查询。
Tables
逗号分隔的远程表名称的列表。无默认值。必须包含表名称的列表。
UpdatableFieldList
逗号分隔的指定给临
时表的远程字段名和本地字段名的列表。可用该选项来为包含无
效
Visual FoxPro
字段名的临时表指定有效的
Visual FoxPro
字段名。
UpdateType
1
用新数据更新旧数据(默认值)
。
2
通过删除旧数据,插入新数据来进行更新。
UseMemoSize
使得结果返回到备注字段的列的最小
宽度
(按字节)
。
例如,
如果列结果的宽度比
UseMemoSize
值大,列结果存储在备注字段中。
UseMemoSize
可从
1
到
255
,默认值是
255
。
WhereType
更新远程表的
WHERE
子句。
WhereType
可以设为下列值:
1
或
DB_KDY
(源于
FOXPRO.H
)
。对
远程表进行更新的
WHERE
子句仅包含由
KeyFieldList
属性指定的主关键字段。
2
或
DB_KEYANDUPDATABLE
< br>(源
于
FOXPRO.H
)<
/p>
。对远程表进行更新的
WHERE
子句仅包含由
KeyFieldList
< br>属性指定的主关键字段及任何可更新字
段
。
3
或
DB_KEYAN
DMODIFIED
(
源
于
FOXPRO.H
)
(
默认值)
。对远程
表进行
更新的
WHERE
子
句
仅
包
含
由
p>
KeyFieldList
属性指定的主关键字段及任何已修改字段。
4
或
DB_KEYANDTIMESTAMP
(源于
FOXPRO
.H
)
。对远程
表进行更新的
WHERE
子句仅包含由
KeyFieldList
属性指定的主关键字段及时间戳。有关
WhereType
属性的详
细内容,请参阅《开发指南》的第八章“创建多表视图
”
。
CTableAlias
:指定要设置属性的表或临时表的别名。
N
WorkArea
:指定要设置属性的表或临时表的工作区。如指定
nWorkArea
为
0
,
CURSORSETPROP(
)
为后面所有的表或临时表设定环境设置。
返回值类型:逻辑型
说明:如果
Visual FoxPro
成功地设置指定的属性,则
CURSORSETPROP(
)
返回“真”
(
.T.
)
;如果不能设
置指定的属性,
Visual FoxPro
将产生错误。
CURSORSETPROP( )
缓冲属性的设置决定
Visual FoxPro
如何执行
记录锁定和更新缓冲。有关记录锁定和更新缓冲的详细内容,请
参阅缓冲访问数据,以及《开发指南》的第十九
章“共享访问程序设计”
。
CURSORSETPROP(
)
的
WhereType
属性设置决
定了在远程表上如何执行更新。有关远程
表更新的其他内容,
请
参阅
《开发指南》
的第六章
“使用数据
库”
。
可用
CURSORSETPROP(
)
改写临时表的
FetchSize
SQLSETPROP( )
属性,默认情况下该属性从临时表的连接句柄继承而来。对于
Visual FoxPro
表和为表创建的临
时表,可用
CURSORGETPROP( )
返回其当前属性设置。如执行不带可选
cTableAlias
或
nWorkArea
参数的
CURSORSETPROP( )
命令,可以为当前选定工
作区中打开的表或临时表指定属性设置。
五
.
示例:
下面示例显示了如何用
CURSORSETPROP( )
激活开放式表缓冲,表缓冲要求
MULTILOCKS
设为
ON
。首先打
开
testdata <
/p>
数据库的
customer
表,然后用<
/p>
CURSORSETPROP( )
设置缓冲方式为开放式表缓
冲(
5
)
。如果成功地
激活开放式表缓冲,则显示“真”
(
.T.
)
,否则显示“假”
(
.
F.
)
。
CLOSE DATABASES
SET
MULTILOCKS ON
SET PATH TO (HOME( ) +
'samplesdata')
&&
设置数据库的路径
OPEN
DATABASE testdata &&
打开
testdata
数据库
第
2
页
共
8
页
USE
customer &&
打开
customer
表
CLEAR
? CURSORSETPROP('Buffering', 5,
'customer') &&
设置缓冲方式
六
. CURSORGETPROP( )
函数
返回
Visual FoxPro
表或临时表的当前属性设置。
语法:
CURSORGETPROP(cProperty
[, nWorkArea | cTableAlias])
参数:
cProperty
:指定要返回的属性设置。
下表列出
了可以返回的属性设置、返回值的数据类型以及返回值说明。
cProperty
可读写。
Buffering
N
1 -
(默认值)行缓冲和表缓冲关闭;
2
打开保守式行缓冲;
3
打开开放式行缓冲;
4
N
连接句柄。只读。
打开保守式表缓冲;
5
打开开放式表缓冲。可读写。
ConnectHandle
ConnectName
C
Database
C
FetchMemo
写。
FetchSize
N
从远程表结果集合中逐步提取的行数。默认是
100
行。设置
FetchSize
为
-1
将检索
逗号分隔的临时表的主字段列表。可读写。
当返回结果集时所提取的最大行数。默认值是
1
(返回所有行)
。
0
值指定运行视图,
如果
SQL
p>
更新查询被执行以更新远程表,则为“真”
(.T.)
,否则为“假”
(.F.)
(默认
< br>整个结果集(但受
MaxRecords
设置限制)
。可读写。
KeyFieldList C
MaxRecords
N
SendUpdates
L
值)
。可读写。
SourceName
是表。只读。
SQL
C
创建临时表时执行的
SQL
语句。只读。
逗号分隔的远程表名的列表。可读写。
逗号分隔的指定给临时表的远程字段名和本地字段名的列表。可用该选项将临时表的无效
Tables
C
C
包含数据库中
SQL
视图或表的长名,或者自由表
的文件路径和表名。只读。
1
指定数据源是本地
SQL
视图;
2
指定数据源是远程
SQL
视图;
3
指定数据源
SourceType
N
L
在创建临时表时使用的命名连接。只读。
如果视图结果中含有备注字段,则为“真”
(.T.)
,否
则为“假”
(.F.)
(默认值)
。可
读
类型
说明
送到缓冲表后端的更新语句的数目。
1
是默认值。调整该值可大大提高更新的性能。
BatchUpdateCount N
包含表或视图的数据库名称。如表是自由表,包含空字符串。只读。
但不提取结果。可读写。
UpdatableFieldList C
Visual
FoxPro
字
段
名
指定为有效的
Visual FoxPro
字
p>
段
名
。
可
读
写
。
UpdateNameList C
逗
号
分
隔
的
视
图
中
字段
的<
/p>
列表
,
该列
表<
/p>
包含
有
本
地和<
/p>
远
程表
的
字段<
/p>
。
可读
写
。
p>
UpdateType
N
可读写。
UseMemoSize
N
WhereType
N
使得结果返回到备注字段的列的最小宽度(按字节)
。例如,如果一个
列的结果的宽度比
更新远程表的
WHERE
子句。
WhereType
可以指定为下列值:
1
或
DB_KEY
(源于
FOXPRO.H
)
。
UseMemoSize
的值大,列结果存储在备注字段中。
UseMemoSize
可以从
1
到
255
,默认值是
255
。可读写。
对远程表进行更新的
WHERE
子句仅包含由
KeyFieldList
属性指定的主关键字段。
2
或
DB_KEYANDUPDATABLE
(源于
FOXPRO.H
)
。对远程表进行更新的
WHERE
子句仅包含由
KeyFieldList
属性指定的主关键字段及任何可更新字段。
3
或
DB_KEYANDMODIFI
ED
(源于
FOXPRO.H
)
p>
(默认值)
。对远程表进行更新的
WHERE
子句仅包含由
KeyFieldList
p>
属性指定
的主关键字段及任何已修改字段。
4
或
DB_KEYANDTIMESTAMP
(源于
FOXPRO
.H
)
。对远程表进行更新的
WHERE
子句仅
包含由
KeyFieldList
属性指定的主关键字段及时间戳。有关
WhereType
的详细内容,请参阅《开发指南》的第八章
“创建多表视图”<
/p>
。可读写。
NWorkArea
:指定从表或临时表的哪一个工作区返回属性设置。如果
nWorkArea
为
0
,
CURSORGETPROP(
)
返回环境设置。
CTableA
lias
:指定要返回属性设置的表或临时表的别名。
返回值类型:字符型、数值型或逻辑型
说明:可用
CURSORSETPROP( )
设置
Visual FoxPro
表或临时表的具体属性。有关每个属性及它们的设置,
请参阅
CURSORSETPROP( )
。如果发出不带可选
cTableAlias
或
nWorkArea
参数的
CURSORGETPROP( )
命令,则
第
3
页
共
8
页
1
指定用新数据更新旧数据
(默认值)
;
2
指定通过删除旧数据,
插入新数据来
进行更新。
在当前选定工作区中打开的表或临时表的当前属性设置被返回。
七
.
示例
下面示例打开了
testdata
数据库中的
customer
表。然后用
CURSORGETPROP( )
来显示表的缓冲方式以及
包含该表的数据库名称。
CLOSE DATABASES
SET PATH TO
(HOME( ) + 'samplesdata')
&&
设置到数据库的路径
OPEN
DATABASE testdata &&
打开
testdata
数据库
USE
customer &&
打开
customer
表
?
CURSORGETPROP('Buffering') &&
显示缓冲方式
?
CURSORGETPROP('Database') &&
显示数据库名称
八
. TABLEREVERT( )
函数
放弃对缓冲行、缓冲表或临时表的修改,并且恢复远程临时表的
OLDVAL( )
数据以及本地表和临时表的当
前磁盘数值
。
语法:
TABLEREVERT([lAllRows] [,
cTableAlias | nWorkArea])
参数:
lAllRows
:决定是否放弃表或临时表的所有更改。如果
lAllRows
是“真”
(.T.)
< br>,并且启用表缓冲,
则放弃表或临时表中对
所有记录
p>
所做的修改;如果
lAllRows
是
“假”
(.F.)
,并且启用表缓冲,则只放弃对表或
临时表中
当前记录
所做的修改。如果启用行缓冲
,则忽略
lAllRows
的值,并且放弃对表或临时表中
当前记录
所
做的修改。
lAllRows
的默认值是“假”
(.F.)
p>
。
cTableAlias
:指定要放弃修改的表或临时表的别名。
NWor
kArea
:指定要放弃修改的表或临时表所在的工作区。
返回值类型:数值型
说明:
TABLEREVERT( )
函数返回放弃修改的记录数目。附注:在网络上,当前存贮在磁盘上的数据可能和
打开
表或创建临时表时磁盘上的数据不同。
这是因为在打开表或创建临时表之后,
其他网络用户可能改变了数据。
对于没有启用行缓冲或表缓冲的表或临时表
,
TABLEREVERT(
)
函
数不能放弃对它们的修改。如果不启用行缓冲或
表缓冲而调用
TABLEREVERT( )
函数,
Visual
FoxPro
将产生错误信息。如果不用可选参数
cTableAlias
或
nWorkArea
调用
TABLEREVERT( )
函数,则只放弃对当前工作区中打开表或临时表所做的修改。
九
.
示例
下面的示例显示了如何使用
TABLEREVERT( )
函数放弃对缓冲表的修改。首先把
MULTILOCKS
设置成
ON
以
请求表缓冲;然后打开
testdata
数据库中的
customer
表,用
CURSORETPROP( )
函数把缓冲方式设置为开放式
表缓冲
(5)
。
首先显示
cust_id
字段值,再用
REPLACE
命令修改
cust_id
字段,显示新的
cust_id
字段值,
最后使用
TABLEREVERT( )
函数把表恢复成原来状态(可以用
TABLEUPDATE(
)
函数实施此更改)
,显示恢复的
cust_id
字段值。
CLOSE DATABASES
SET
MULTILOCKS ON &&
对于表缓冲必须为
ON
SET PATH TO (HOME( ) +
'samplesdata')
&&
设置数据库路径
OPEN
DATABASE testdata &&
打开“
te
stdata
”数据库
USE
Customer &&
打开“
customer
p>
”表
=
CURSORSETPROP('Buffering', 5, 'customer') &&
启用表缓冲
CLEAR
? 'Original cust_id value: '
?? cust_id &&
显示当前“
< br>cust_id
”的值
REPLACE cust_id WITH '***' &&
改变字段的内容
? 'New
cust_id value: '
?? cust_id &&
显示新的“
cust_id
”值
= TABLEREVERT(.T.) &&
放弃所有表的更改
?
'Reverted cust_id value: '
?? cust_id
&&
显示恢复的“
cust_id
”
的值
十
.
追加记录到表缓冲区
?
若要追加记录到表缓冲区,在启用表缓冲之后使用
APPEND
或
APPEND BLANK
命令。追加的记录具有序列递
增的负
RECNO( )
值。
第
4
页
共
8
页