Functions.TableUpdate 方法 | |
-- todo --
提交对缓冲行、缓冲表、游标或游标适配器所做的更改。
命名空间:
XSharp.VFP
程序集:
XSharp.VFP (在 XSharp.VFP.dll 中) 版本:2.22 GA
语法 FUNCTION TableUpdate(
nRows,
lForce,
uArea,
cErrorArray
) AS LOGIC CLIPPER
[ClipperCallingConventionAttribute(new string[] { ... })]
public static bool TableUpdate(
__Usual nRows = default,
__Usual lForce = default,
__Usual uArea = default,
__Usual cErrorArray = default
)
查看代码参数
- nRows (Optional)
- 类型:__Usual
指定应提交对表或游标所做的哪些更改。
备注: |
---|
X#默认为与CursorAdapter对象关联的游标启用乐观行缓冲。
|
备注部分的表格描述了nRows的值。
- lForce (Optional)
- 类型:__Usual
确定X#是否覆盖网络上另一用户对表或游标所做的更改。
备注部分的表格描述了lForce的值。
- uArea (Optional)
- 类型:__Usual
指定提交更改的表或游标的别名。如果包含表或游标别名,必须包含lForce参数。
或
指定提交更改的表或游标的工作区。如果包含工作区,必须包含lForce参数。
- cErrorArray (Optional)
- 类型:__Usual
指定当nRows = 2且无法提交对记录的更改时创建的数组的名称。
该数组包含一个单列,其中包含无法提交更改的记录的记录号。
如果包含数组名称,必须包含表或游标别名uArea或工作区号。
备注: |
---|
如果在更新记录时发生简单提交错误以外的错误,cErrorArray的第一个元素将包含-1,
然后可以使用AError()来确定无法提交更改的原因。
|
当cErrorArray存在时,X#将其值传递给CursorAdapter的AfterCursorUpdate事件。
返回值
类型:
Boolean
逻辑数据类型。如果所有记录的更改都被提交,
TableUpdate()返回True (.T.)。
否则,
TableUpdate()返回False (.F.)表示失败。不会执行ON ERROR例程。
可以使用AError()函数获取有关失败原因的信息。
备注: |
---|
当使用表缓冲更新数据,并且在将BatchUpdateCount设置为大于1的值时从多个客户端更新数据源中的表时,
TableUpdate()始终返回True (.T.)。
|
因此,在这些情况下避免将
BatchUpdateCount设置为大于1的值。
备注 TableUpdate()无法提交对未启用行或表缓冲的表或游标所做的更改。
如果发出
TableUpdate()而未启用行或表缓冲,X#会生成错误消息。
但是,
TableUpdate()仍然可以提交对具有验证规则的表或游标的更改。
要启用或禁用行和表缓冲,请使用
CursorSetProp()。
如果没有可选的uArea参数发出
TableUpdate(),则更改将提交到当前选定工作区中打开的表或游标。
如果使用表缓冲并更新多个记录,
TableUpdate()会将记录指针移动到最后更新的记录。
备注: |
---|
对不使用键字段的本地表或视图调用TableUpdate()会生成一个长的Where子句来查找更新行。
Where子句中支持的默认字段数为40。如果收到错误SQL:语句太长(错误1812),
应该使用更新的键字段或使用SYS(3055)增加Where子句的复杂性。
如果使用SYS(3055)函数,
将其值增加到表中字段数的8倍,如以下示例所示:
|
1SYS(3055, 8 * MIN(40, FCOUNT( ))
执行批量
TableUpdate()操作时,由于开放式数据库连接(ODBC)的工作方式,
当服务器未生成错误但未更新任何内容时,X#无法检测到冲突,例如,
没有行匹配
Where子句。当使用WhereType设置为DB_KEYANDUPDATable、DB_KEYANDMODIFIED
或DB_KEYANDTIMESTAMP,并且另一个用户更改了
Where子句中的一个基础值,使得更新语句找不到该行时,可能会发生这种情况。
与CursorAdapter对象的交互 使用
CursorAdapter对象时适用以下行为:
有关
GetFldState()的更多信息,请参见GetFldState()函数。
您还可以修改游标中的数据。此功能支持诸如从基表检索自动增量值并将其插入游标等场景。当发生此场景时,
CursorAdapter对象应在事件发生后自动返回到
即将提交更改的记录,并提交更改。
在X# 9.0中,当TableUpdate()操作进行时,不能发出TableRevert()函数。
通常,CursorAdapter对象使用ADO或ODBC API提供的事务管理功能,X#在TableUpdate()函数成功完成时关闭
事务。但是,如果您想直接向后端发送事务管理命令,可以将CursorAdaptor对象的UseTransactions属性设置为False (.F.),CursorAdapter就不会使用
事务来发送Insert、Update或Delete命令。
nRows | 描述 |
---|
0 |
如果启用了行或表缓冲,仅提交对游标中当前行所做的更改。(默认)
使用CursorAdapter对象时,X#仅为该行执行InsertCmd、UpdateCmd或DeleteCmd属性中的适当命令。
|
1 |
如果启用了表缓冲,提交对表或游标中所有记录所做的更改。
如果启用了行缓冲,仅提交对表或游标中当前记录所做的更改。
使用CursorAdapter对象时,X#为每个受影响的行执行InsertCmd、
UpdateCmd和DeleteCmd属性中的适当命令。
|
2 |
以与nRows = 1相同的方式提交对表或游标所做的更改。
但是,当无法提交更改时不会发生错误。X#继续处理表或游标中的任何剩余记录。
如果包含cErrorArray,则在发生错误时创建包含错误信息的数组。
|
为了与以前的X#应用程序兼容,nRows参数还接受False (.F.)和True (.T.),分别代替0和1。
当为nRows指定0或1时,记录指针保持在无法提交更改的记录上。
要确定无法提交更改的原因,请使用AError()函数。
使用
CursorAdapter对象并为nRows指定1或2时,除非发生错误,否则必须在同一次调用
TableUpdate()期间提交
以下
CursorAdapter事件中对游标所做的所有更改:
X#将nRows的值传递给
CursorAdapter的BeforeCursorUpdate事件。
lForce | 描述 |
---|
False (.F.) |
从第一条记录开始,向表或游标的末尾继续提交更改。
(默认)
|
True (.T.) |
覆盖网络上另一用户对表或游标所做的任何更改。Where子句仅使用键字段。
|
使用
CursorAdapter对象时,X#将lForce的值传递给以下
CursorAdapter事件:
示例 1Close Databases
2Create Table employee (cLastName C(10))
3Set MultiLocks ON
4= CursorSetProp('Buffering', 5, 'employee' )
5Insert Into employee (cLastName) VALUES ('Smith')
6Clear
7? '原始cLastName值:'
8?? cLastName
9Replace cLastName WITH 'Jones'
10? '新cLastName值:'
11?? cLastName
12= TableUpdate(.T.)
13? '更新后的cLastName值:'
14?? cLastName
参见