点击或拖拽改变大小

DbServer 类

X#
创建一个可以操作现有 .DBF 数据库文件及其关联索引文件的数据服务。
继承层次
Object
  DataServer
    DbServer
      AdsSQLServer

命名空间:  VO
程序集:  VORDDClasses (在 VORDDClasses.dll 中) 版本:2.22 GA
语法
 CLASS DbServer INHERIT DataServer
查看代码

DbServer 类型公开以下成员。

构造函数
  名称说明
公共方法代码示例DbServer
构造一个服务对象。
Top
属性
  名称说明
公共属性Alias
表示工作区别名的字符串。
公共属性AliasSym
表示 DBServer 对象别名的符号。
公共属性代码示例BoF
一个逻辑值,指示服务是否位于文件的开头,即第一条记录上。
(重写 BoF.)
公共属性Clients
**缺少文档**
(继承自 DataServer。)
公共属性代码示例ConcurrencyControl
一个常量,标识此数据服务的自动并发控制模式,确定何时以及如何锁定和释放记录:
(重写 ConcurrencyControl.)
公共属性代码示例DBStruct
包含此数据服务结构的数组,其长度(即元素数量)等于服务中的字段数。
(重写 DBStruct.)
公共属性DbStructure
从 DbServer 对象返回原始 DbStructure 数组。
公共属性代码示例Deleted
一个逻辑值,指示当前记录是否被标记为删除。
公共属性Driver
表示此服务使用的数据库驱动程序名称的字符串。
公共属性代码示例EoF
一个逻辑值,指示服务是否位于文件的末尾,即最后一条记录上
(重写 EoF.)
公共属性代码示例ErrInfo
标识上次操作后错误条件的 Error 对象。
公共属性ErrorInfo
返回内部 ErrorInfo 对象,无论上次操作是否产生错误。
公共属性代码示例FCount
服务中的字段数。
(重写 FCount.)
公共属性FieldDesc
这将返回一个空数组。对于在 DbServer 编辑器中绘制的服务,这将返回 DataFields 数组。
公共属性代码示例FileSpec
定义 DBF 文件路径和文件名的 FileSpec 对象。
公共属性代码示例Filter
表示当前活动过滤器的字符串。
公共属性代码示例ForBlock
“一般服务范围”的“For block”组件,如果在没有显式范围的情况下调用,则会影响多个批量处理方法。
公共属性代码示例Found
指示上一次搜索操作是否成功的逻辑值。
公共属性代码示例Header
表示数据库文件头长度的数值。
公共属性HLStatus
**缺少文档**
(继承自 DataServer。)
公共属性代码示例HyperLabel
连接到此数据服务的超标签。通过超标签,您可以检索有关数据服务的其他信息。
(继承自 DataServer。)
公共属性IndexExt
表示基于当前链接的数据库驱动程序的默认索引扩展名的字符串(例如,DBFNTX 驱动程序的“.NTX”)。
公共属性IndexList
这将返回一个空数组。对于在 DbServer 编辑器中绘制的服务,这将返回索引数组。
公共属性代码示例LastRec
当前数据库文件中的记录数。
公共属性Lupdate
服务使用的 DBF 文件的最后修改日期。
公共属性MemoExt
这将返回文件的备注扩展名(如果有)。例如 DBT 或 FPT。
公共属性Name
这将返回 DbServer 的名称。
(重写 Name.)
公共属性NameSym
表示此数据服务名称的符号。
(继承自 DataServer。)
公共属性OleExt
这将返回文件的OLE扩展名(如果有)。例如 DFL。
公共属性OrderBottomScope
表示将在控制 order 的当前范围内包含的键值范围的底部边界的记录的键值。
公共属性OrderKeyVal
控制顺序中当前记录的键值。
公共属性OrderTopScope
表示控制顺序当前范围内顶部边界记录的键值。
公共属性PaintedStructure
这将返回基于服务编辑器中绘制的 DataFields 和 Fieldspecs 的 DBSTRUCT 数组。
公共属性RddName
表示此服务使用的数据库驱动程序的名称的字符串。
公共属性Rdds
这将返回传递给 DbServer 构造函数的 RDD 列表。
公共属性代码示例ReadOnly
指示文件是否以只读文件打开的逻辑值。这由服务的实例化参数确定。
公共属性代码示例RecCount
当前数据库文件中的记录数。
(重写 RecCount.)
公共属性代码示例RecNo
表示当前记录号的数值,标识记录指针的位置。
(重写 RecNo.)
公共属性代码示例RecSize
表示服务记录长度(以字节为单位)的数值。
公共属性RelationChildren
返回使用 SetRelation() 注册的子项数组
公共属性Retries
确定 DbServer 对象应重试失败操作的次数的设置。
公共属性代码示例RLockList
当前锁定的记录号数组。
公共属性代码示例Scope
“通用服务范围”的“范围”组件,如果调用时没有显式范围,则会影响多个批量处理方法。范围的初始值为 NIL。
公共属性SelectionWorkArea
当 dbserver 是关系中的子项时,父区域的工作区号。
公共属性代码示例Shared
指示服务是可共享还是独占的逻辑值。
公共属性代码示例Status
标识上次操作后状态的 HyperLabel 对象。如果
(重写 Status.)
公共属性TableExt
返回打开的 DBF 的扩展名。通常是.DBF,但如果打开了具有不同扩展名的文件,则可能不同。
公共属性Used
指示服务当前是否打开的逻辑值
公共属性代码示例WhileBlock
影响多个批处理方法的“通用服务范围”的“WHILE块”组件,如果它们在没有明确范围的情况下调用
公共属性WorkArea
表示服务的工作区编号
Top
方法
  名称说明
公共方法Append
向此数据服务的末尾添加一个空白记录(新记录成为当前位置,并准备分配数据值)。
(继承自 DataServer。)
公共方法Append(__Usual)
向表中追加一个空白记录;此空白记录成为当前位置,并准备分配数据值。如果 Append() 方法返回 TRUE,则记录会自动锁定。
公共方法AppendDB
从另一个 DBF 文件向表中追加新记录。
公共方法AppendDelimited
从分隔文件(例如“逗号分隔值”(CSV)文件格式)向表中追加新记录。
公共方法AppendSDF
从 SDF 格式的文件向表中追加新记录。
公共方法AsString
返回为此数据服务定义的描述性标签。
(继承自 DataServer。)
公共方法Average
根据涉及的实际记录数计算一系列数值表达式的平均值。
公共方法代码示例BLOBDirectExport
将二进制大对象(BLOB)指针的内容导出到文件。
公共方法代码示例BLOBDirectGet
检索存储在 BLOB 文件中的数据,而无需引用特定字段。
公共方法代码示例BLOBDirectImport
将文件导入 BLOB 文件并返回指向数据的指针。
公共方法代码示例BLOBDirectPut
将数据放入 BLOB 文件中,而无需引用特定字段。
公共方法代码示例BLOBExport
将由其备注字段编号标识的 BLOB 内容复制到文件。
公共方法代码示例BLOBGet
获取由其备注字段编号标识的 BLOB 内容。
公共方法代码示例BLOBImport
将文件的内容读取为由备注字段编号标识的 BLOB。
公共方法代码示例BLOBRootGet
从 BLOB 文件的根区域检索数据。
公共方法代码示例BLOBRootLock
获取 BLOB 文件根区域的锁。
公共方法代码示例BLOBRootPut
将数据存储在 BLOB 文件的根区域。
公共方法代码示例BLOBRootUnlock
释放对 BLOB 文件根区域的锁定。
公共方法ClearFilter
清除使用 DBServer:SetFilter() 方法指定的过滤条件。
公共方法ClearIndex
清除当前与服务关联的所有索引。
公共方法ClearLocate
清除服务的 LOCATE 条件(如果有)。
公共方法ClearOrderScope
设置或清除控制顺序中键值范围的边界。
公共方法ClearRelation
清除此服务与其他服务之间的所有活动关系。
公共方法ClearScope
清除定义多记录操作默认范围的设置。
公共方法Close
关闭数据库文件及其关联的索引文件。
(重写 Close.)
公共方法Commit
将所有更改从缓冲区提交到磁盘,确保所有缓冲区都已刷新。
(重写 Commit.)
公共方法ConstructUniqueAlias
基于文件名和可选的数字后缀创建唯一别名
公共方法Continue
继续挂起的 DBServer:Locate() 操作,搜索下一个匹配的记录(类似于 DBContinue() 函数)。
公共方法代码示例CopyDB
将记录复制到另一个 DBF 文件。
公共方法CopyDelimited
将记录复制到分隔文件。
公共方法CopySDF
将记录复制到 SDF 文件。
公共方法代码示例CopyStructure
创建与发送消息的服务对象具有相同记录布局的DBF文件。
公共方法代码示例Count
返回匹配指定范围的记录数。
公共方法CreateIndex
创建包含一个 order 的索引文件。
公共方法CreateOrder
在现有索引文件中创建一个 order。行为取决于使用的驱动程序。
公共方法DataField
检索指定字段位置的数据字段对象。
(重写 DataField(__Usual).)
公共方法Delete
删除此数据服务中的当前记录。
(继承自 DataServer。)
公共方法Delete(__Usual, __Usual, __Usual)
删除当前记录或指定范围内的记录。
公共方法DeleteAll
删除表中的所有记录。
公共方法DeleteOrder
从索引文件中删除一个 order。
公共方法代码示例Error
提供一种方法来处理在数据库处理期间引发的错误条件。
公共方法Eval
为每个匹配范围和条件的记录评估代码块。如果方法没有传递条件或范围,则受一般服务范围的约束。
公共方法代码示例FIELDGET
获取由其位置标识的字段的内容。
(重写 FIELDGET(__Usual).)
公共方法FieldGetBytes
直接从工作区缓冲区读取字节数组。
公共方法FieldGetFormatted
根据其 FieldSpec 对象的格式规范返回指定字段的内容。
(重写 FieldGetFormatted(__Usual).)
公共方法FieldHyperLabel
返回指定字段的超链接标签。
(重写 FieldHyperLabel(__Usual).)
公共方法代码示例FieldInfo
返回并可选更改有关字段的信息。
公共方法FieldName
以字符串形式返回指定字段的名称。
(重写 FieldName(__Usual).)
公共方法FieldPos
返回数据服务中指定字段的位置,作为从1开始的数字。
(重写 FieldPos(__Usual).)
公共方法代码示例FIELDPUT
设置由其位置标识的字段的值。
(重写 FIELDPUT(__Usual, __Usual).)
公共方法FieldPutBytes
将字节数组直接写入工作区缓冲区。
公共方法FieldSpec
返回指定字段中的 FieldSpec 对象。
(重写 FieldSpec(__Usual).)
公共方法FieldStatus
返回上次操作后的字段状态。
(重写 FieldStatus(__Usual).)
公共方法FieldSym
返回指定字段的名称。
(重写 FieldSym(__Usual).)
公共方法FieldValidate
执行定义在字段的 FieldSpec 对象中的所有验证(例如,必需、最大和最小位数、最大和最小值、验证规则)并返回测试结果。
(重写 FieldValidate(__Usual, __Usual).)
公共方法FLOCK
锁定此服务使用的表以进行独占访问。
(重写 FLOCK.)
公共方法代码示例GetArray
从服务中的字段检索值数组,受当前活动选择的约束(如果有)。
公共方法GetLocate
检索当前 LOCATE 条件的代码块,如果未设置代码块,则返回 NIL。
公共方法代码示例GetLookupTable
从服务中的两个字段检索两列值数组,受当前活动选择的约束(如果有)。
公共方法GoBottom
将数据服务定位在最后一条记录。
(重写 GoBottom.)
公共方法GoTo
将数据服务定位在指定的记录号。
(重写 GoTo(__Usual).)
公共方法GoTop
将数据服务定位在第一条记录。
(重写 GoTop.)
公共方法INDEXKEY
返回指定单序索引的键表达式。
公共方法INDEXORD
返回 order 列表中控制 order 的序数位置。(类似于 IndexOrd() 函数。)
公共方法代码示例Info
返回并可选地更改有关数据服务的信息。
公共方法Join
将此 DBServer 对象与另一个 DBServer 对象连接,并将结果放入指定的文件中。
公共方法Locate
顺序搜索匹配条件的记录。如果方法没有传递条件或范围,则受一般服务范围的约束。
公共方法LockCurrentRecord
锁定当前记录。此方法与调用 RLock() 并将当前记录号作为参数相同。
公共方法代码示例LockSelection
锁定当前活动选择中的所有记录。
公共方法NoIVarGet
提供一个通用错误拦截,当对不存在的导出实例变量进行访问引用时(在任何类中)自动调用。在 DBServer 类中,它用于实现虚拟字段变量。 重要!NoIVarGet()不应直接调用;它由系统调用以处理无效引用。
(重写 NoIVarGet(__Usual).)
公共方法NoIVarPut
提供一个通用错误拦截,当对不存在的导出实例变量进行赋值引用时(在任何类中)自动调用。在 DBServer 类中,它用于实现虚拟字段变量。 重要!NoIVarPut() 不应直接调用;它由系统调用以处理无效引用。
(重写 NoIVarPut(__Usual, __Usual).)
公共方法Notify
一个事件处理程序,用于响应此服务的方法中发生的事件,或与此服务以某种方式链接的其他服务中的事件。标准实现会通知服务的所有客户端该事件。 重要!此方法由数据服务的各种操作方法自动调用,通常不应由应用程序代码调用。
(重写 Notify(__Usual, __Usual).)
公共方法代码示例OrderDescend
返回并可选地更改 order 的降序标志。
公共方法代码示例OrderInfo
返回并可选地更改有关 order 和索引文件的信息。
公共方法代码示例OrderIsUnique
返回给定 order 的唯一标志状态。
公共方法代码示例OrderKeyAdd
向自定义构建的 order 添加键。
公共方法代码示例OrderKeyCount
返回 order 中的键数。
公共方法代码示例OrderKeyDel
从自定义构建的 order 中删除键。
公共方法代码示例OrderKeyGoTo
移动到控制 order 中由其逻辑记录号指定的记录。
公共方法代码示例OrderKeyNo
获取当前记录的逻辑记录号。
公共方法代码示例OrderScope
设置控制顺序中键值范围的边界。
公共方法代码示例OrderSkipUnique
将记录指针移动到控制顺序中的下一个或上一个唯一键。
公共方法Pack
从数据库文件中删除已删除的记录。
公共方法PostInit
实现窗口的自定义初始化代码。
(继承自 DataServer。)
公共方法PreInit
实现服务的自定义初始化代码。
(继承自 DataServer。)
公共方法RDDINFO
返回并可选更改由 RDD 直接控制的设置。
公共方法Recall
召回由指定范围指示的已删除记录。
公共方法RecallAll
召回表中的所有已删除记录。
公共方法RecordInfo
检索有关指定记录的信息。
公共方法Refresh
从数据库重新读取当前记录,丢弃所做的任何更改。
公共方法RegisterClient
将对象注册为此数据服务的客户端,以便它接收来自服务的有关某些操作的通知消息。
(继承自 DataServer。)
公共方法Reindex
重新创建此服务的所有活动索引。
公共方法Relation
返回指定关系的链接表达式。
公共方法代码示例Replace
用新表达式替换与指定范围匹配的所有记录的一个或多个字段。
公共方法ResetNotification
恢复向服务的附加客户端广播 Notify 消息(在调用 DBServer:SuspendNotification() 之后)。
(重写 ResetNotification.)
公共方法RLOCK
锁定记录以进行独占写访问;其他用户仍然可以对记录进行只读引用。
(重写 RLOCK(__Usual).)
公共方法RLockVerify
确定此数据服务中的当前记录是否有任何挂起的更新,如果没有,则锁定它以进行独占写访问。
(重写 RLockVerify.)
公共方法Rollback
撤消在当前事务中对该数据服务所做的更改。
(继承自 DataServer。)
公共方法Seek(__Usual)
移动到控制顺序中具有指定键值的下一条记录。
(继承自 DataServer。)
公共方法代码示例Seek(__Usual, __Usual, __Usual)
移动到控制顺序中具有指定键值的记录。
公共方法SELECT
选择 DbServer 使用的工作区。
公共方法SetDataField
为指定字段分配 DataField 对象。
(重写 SetDataField(__Usual, __Usual).)
公共方法代码示例SetFilter
设置过滤条件。
公共方法代码示例SetIndex
打开索引文件并选择其顺序作为控制顺序(如果这是第一个打开的索引)。
公共方法SetOrder
从已打开的索引文件中选择一个顺序作为控制顺序。
公共方法SetOrderCondition
设置应用于索引和顺序创建的条件。如果未调用 SetOrderCondition(),则顺序创建受通用服务范围的约束。如果两者都未设置,则顺序没有条件。
公共方法代码示例SetRelation
设置从此服务到子服务的关系。
公共方法代码示例SetSelectiveRelation
设置从此服务到子服务的选择性关系;标准数据库操作仅限于匹配关系的记录。
公共方法Skip
将记录指针向前或向后移动指定数量的记录。
(重写 Skip(__Usual).)
公共方法Sort
将记录按排序顺序复制到另一个数据库文件。如果方法没有传递条件或范围,则受通用服务范围的限制。
公共方法代码示例Sum
计算一系列数值表达式的总和。
公共方法SuspendNotification
暂停向服务的附加客户端广播 Notify 消息。
(重写 SuspendNotification.)
公共方法代码示例Total
按键值汇总记录,生成分组汇总,并将汇总记录写入另一个数据库。
公共方法UnLock
删除此数据服务上持有的所有锁定。
(继承自 DataServer。)
公共方法UnLock(__Usual)
释放指定的锁或所有锁。
公共方法UnRegisterClient
取消对象作为此数据服务客户端的注册,以便它不再接收来自服务的有关某些操作的通知消息。
(继承自 DataServer。)
公共方法Update
使用另一个服务或表中的数据更新此服务。
(继承自 DataServer。)
公共方法Update(__Usual, __Usual, __Usual, __Usual)
使用另一个服务或表中的数据更新此服务。
公共方法Zap
永久删除服务中的所有记录并释放磁盘空间。
Top
备注
下表列出了反映当前活动选择的属性和方法:
方法或属性描述
BOF尝试将位置设置在选择中的第一个记录之前。
EOF尝试将位置设置在选择中的最后一个记录之后。
Found仅在选择中找到记录时(在 Seek()、Locate()、Continue() 之后)指示是否找到记录。
RecCount返回选择中的记录数(请注意,LastRec 不依赖于选择)。
Average()如果未指定范围,则在当前选择上进行计算,而不是在所有记录上进行计算。
Continue()限制搜索到当前选择。
CopyDB(), CopySDF(), CopyDelimited() 如果未指定范围,则复制当前选择,而不是所有记录。
Count()如果未指定范围,则在当前选择上进行计算,而不是在所有记录上进行计算
DeleteAll()删除选择中的所有记录,而不是文件中的所有记录
Eval()如果未指定范围,则在当前选择上评估代码块,而不是在所有记录上评估
GetArray()限制数组到当前选择
GetLookupTable()限制查找表到当前选择
GoTop()转到选择中的第一个记录
GoTo()如果记录号不在选择中,则失败
GoBottom()转到选择中的最后一个记录
Locate()仅在选择中找到记录时成功
LockSelection()锁定当前选择中的所有记录
RecallAll()召回选择中的所有记录,而不是文件中的所有记录
Replace()如果未指定范围,则在当前选择上处理,而不是在所有记录上处理
Seek()如果搜索值与选择值相同,则定位到当前选择的开头;否则,定位到文件的最后一个记录并设置EOF标志(忽略Softseek)
Skip()如果移动会导致超出选择范围:定位到选择的最后一个记录并设置EOF标志,或者定位到选择的第一个记录并设置BOF标志,取决于移动的方向
Sort(), Sum(), Total()如果未指定范围,则在当前选择上处理,而不是在所有记录上处理
提示 提示:
以下方法不受活动选择的限制: AppendDB(), AppendDelimited(), 和 AppendSDF(),因为它们的范围参数适用于源文件,而不是这个服务 Delete() , 因为它的默认是这条记录,而不是所有 Recall() ,因为它的默认是这条记录,而不是所有
几个Xbase数据库命令提供了一些选项,用于通过关键字指定操作范围: ALL、REST、NEXT nRecords、RECORD nRecord,以及 FOR 和 WHILE 子句。 这些子句的语义,以及在指定了多个子句时它们的交互方式,都在程序员指南的"Using DBF Files"部分中描述。 相应的 DBServer 方法(如 Average()、AppendDB()、CopyDB()、Sort()、Sum()、Total() 等)允许在调用中作为参数指定 FOR 子句、WHILE 子句和范围。 此外,还可以使用简单的赋值(也提供了相应的访问)设置一个"通用服务范围"。 当在没有明确范围的情况下调用这些批量处理方法时,这个通用范围就会应用。这种方法在许多情况下可能更方便。 例如,要删除接下来的五条记录:
X#
1oDB:Scope := 5 // NEXT 5 records
2oDB:Delete()
3oDB:Scope := NIL // 不要忘记重置范围!
例如,要删除所有剩余的记录:
X#
1oDB:Scope := DBScopeRest // REST
2oDB:Delete()
3oDB:Scope := NIL // 不要忘记重置范围!
要计算新泽西州的Smiths的数量:
X#
1oDBCust:SetOrder("CustomerName") // 按名称排序
2oDBCust:Seek("Smith") // 找到第一个Smith
3oDBCust:WhileBlock := {||CustomerName = "Smith"}
4// 当仍在Smiths上时...
5oDBCust:ForBlock := {||State = "NJ"} // 在新泽西州的顾客
6// 中...
7Tally := oDBCust:Count() // 计算数量!
8oDBCust:ClearScope() // 重置所有内容
请记住在后续操作中恢复作用域:作用域是持久的,并且在所有后续基于作用域的方法中都有效,直到被重置。 这种指定作用域的样式带来的便利性也伴随着长时间保持作用域的危险。可以使用 DBServer:ClearScope() 方法或将 NIL 分配给个体组件来重置作用域。 通用服务作用域可以通过以下方式设置:
属性含义
ForBlock指定FOR条件的字符串或代码块。
Scope DBSCOPEALL、DBSCOPEREST或一个数字 nRecords(意味着NEXT nRecords)。
WhileBlock指定WHILE条件的字符串或代码块。
注意,这种方法不提供指定特定记录号的方式。很少需要处理特定记录(例如,记录5的平均工资)。 在需要时,例如对于 Delete(),使用 RecNo := n, GoTo(n) 或 Seek(Value) 定位服务,然后调用 Delete()。 受通用服务作用域影响的方法包括:
方法名称描述
AppendDB()从DBF追加记录。
AppendDelimited()从分隔文件追加记录。
AppendSDF()从SDF文件追加记录。
Average()计算表达式的平均值。
CopyDB()将记录复制到DBF。
CopyDelimited()将记录复制到分隔文件。
CopySDF()将记录复制到SDF文件。
Count()统计匹配的记录数量。
Delete()删除记录。
Eval()为每条记录评估代码块。
Join()与另一个DBF合并,写入DBF。
Locate()找到匹配条件的记录。
Recall()恢复已删除的记录。
Replace()用DBF中的数据替换值。
Sort()将记录排序到DBF。
Sum()计算表达式的和。
Total()将字段汇总到DBF。
当然,默认作用域是“无作用域”,因此这些方法与相应的命令和函数具有相同的默认行为。 它们大多数处理所有记录或所有剩余记录,取决于作用域如何定义;那些默认为“当前记录”的方法也具有相应的“所有”方法:
方法名称描述
Delete()删除当前记录。
DeleteAll()删除所有记录。
Recall()恢复当前记录。
RecallAll()恢复所有记录。
但请注意,如果指定了选择性关系,则默认源作用域是选择,而不是整个文件。因此,我们有四个级别的继承,关于操作的作用域: 1. 通过调用参数明确指定的作用域 2. 如果没有提供,则通过 ForBlock、WhileBlock 和Scope 属性设置的作用域 3. 如果没有设置,则指定的选择 4. 如果没有活跃的选择关系,则整个文件例外是 Delete() 和 Recall(),它们使用选项1和2,然后默认为当前记录。 DeleteAll() 和 RecallAll() 应用于当前选择,如果有;否则,应用于整个文件。当然,选择作用域对 Append... 方法不相关,因为条件应用于源文件, 而不是这个服务。 DBServer 编辑器生成了 DBServer 类的子类,一个具有特定信息的子类,如文件名和虚拟字段创建为访问/赋值方法。 不可能使用 DBServer 类来创建数据库文件;文件必须在打开服务之前存在。要创建数据库文件, 使用 DBCreate() (推荐)方法、VODBCreate() 函数或 DBServer 编辑器。 本节描述了在创建多个 DBServer 工作区或服务时使用的共享访问和别名机制,以及混合对象/过程操作。 工作区 创建 DBServer 对象时,会在工作区中打开数据库。没有指定是否应使用新或现有工作区的选项;DBServer 总是使用新工作区。 实例化后,新的工作区并未被选中;在实例化之前选中的工作区仍然保持活跃。因此, 实例化 DBServer 后发出的传统数据库命令和函数不应用于新打开的数据库。正确的操作新 DBServer 的方法是通过其方法。 共享访问 在同一个数据库文件上创建两个 DBServer 对象相当于在两个不同工作区中打开同一个文件。 两个服务(工作区)各自维护自己的位置和记录锁,并作为两个用户共享访问同一个文件的方式操作。 为了允许在同一个数据库文件上创建两个服务(打开同一个文件在两个工作区),它们必须在共享模式下打开;否则,第二次尝试将产生共享冲突。 然而,这并不会引发错误条件,而是将对象的无效状态存储。使用 DBServer:Status 或 DBServer:Used 属性在实例化后验证文件是否成功打开。 共享模式可以作为实例化参数指定(例如,SetExclusive(FALSE) 在 Start() 函数中),或作为系统默认(见 DBServer:Init())。 别名 当使用 DBServer 的方法来与数据库工作时,不需要别名;DBServer 对象提供了数据库的句柄。别名在操作 DBServer 对象时不起作用, 但系统内部需要每个工作区的唯一别名。 DBServer 自动构造唯一别名。如果文件在任何其他工作区或服务中未打开,它使用文件名作为传统方式的别名,但如果文件已经打开, 它会通过追加数字创建唯一别名。因此,两次打开 CUSTOMER 文件将产生两个别名 #Customer 和 #Customer_1。 唯一使用别名的原因是执行“混合”操作,使用传统的过程操作与 DBServer 对象。这种做法强烈不推荐, 因为 DBServer 对象可能不知道通过命令完成的操作,DBServer 方法可能在使用过程命令后出现故障 (更多详细信息,请见程序员指南中的“使用 DBF 文件”)。 可以从 DBServer 对象中检索自动生成的别名,以便选择工作区作为过程数据库操作的焦点:
X#
1oDBCust := DBServer{"customer"}
2cCust := oDBCust:Alias
3SELECT (cCust)
4SKIP
5DELETE
6? (cCust) -> CustNo
我们在 RDD 类中所做的大多数更改都是为了提高 RDD 类的速度。其中一个更改可能会影响您的应用程序: 在旧实现中,Visual Objects 在每个 DbServer:Method 调用后都会恢复‘当前工作区’。这只有在您混合使用面向对象的 DBF 访问和传统的工作区导向 DBF 访问时才有用。 如果您只做面向对象的 DBF 访问,工作区切换是无必要的,并且可能对应用程序的性能产生负面影响。 因此,我们在 RDD 类中添加了一个开关,允许您启用/禁用这种恢复机制。Visual Objects 2.8 的默认值是 NOT 恢复工作区。这个开关是:
X#
1DbSetRestoreWorkarea(lEnable)
这是一个全局开关,它改变了 DBServer 类的行为。 lEnable 标志的默认值是 FALSE,这意味着工作区恢复被禁用。因此,在每个 DbServer 方法结束时,当前工作区是 DBServer 的工作区。 如果您将 lEnable 标志设置为 TRUE,每个 DBServer 方法在方法结束时都会恢复工作区到方法开始时的工作区值。这是旧行为,但需要一些额外的时间。 DbSetRestoreWorkarea() 的返回值是前一个值。 如果 lEnable 为 NIL,则不设置开关,SetRestoreWorkarea() 只返回当前值。 DbSetRestoreWorkarea() 也改变了内部函数 __DBSetSelect(siNew) 的行为。 如果您调用 DbSetRestoreWorkarea(TRUE),它是默认的 __DBSetSelect(),与 VODBSetSelect() 相同; 如果您调用DbSetRestoreWorkarea(FALSE),DBSetSelect() 为空,不做任何事情。
提示 提示:
VO 2.8 中的 DbServer 类发生了一些主要的更改。请阅读本主题的底部部分,如果您从较老版本的 Visual Objects 迁移。
参见