点击或拖拽改变大小

Functions.TableUpdate 方法

X#
-- todo --
提交对缓冲行、缓冲表、游标或游标适配器所做的更改。

命名空间:  XSharp.VFP
程序集:  XSharp.VFP (在 XSharp.VFP.dll 中) 版本:2.22 GA
语法
 FUNCTION TableUpdate(
	nRows,
	lForce,
	uArea,
	cErrorArray
) AS LOGIC CLIPPER
查看代码

参数

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倍,如以下示例所示:
X#
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#为每个受影响的行执行InsertCmdUpdateCmdDeleteCmd属性中的适当命令。
      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事件:
    示例
    X#
     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  // 显示当前cLastName值(Smith)。
     9Replace cLastName WITH 'Jones'
    10? '新cLastName值:'
    11?? cLastName  // 显示新cLastName值(Jones)。
    12= TableUpdate(.T.)  // 提交更改。
    13? '更新后的cLastName值:'
    14?? cLastName  // 显示当前cLastName值(Jones)。
    参见