字段对象

每个 Field 对象通常对应于数据库表中的一个列。 但是,Field 还可以表示指向另一个 Recordset 的指针,称为章节。 本指南稍后将介绍异常(如章节列)。

使用 Field 对象的 Value 属性设置或返回当前记录的数据。 根据提供程序公开的功能,Field 对象的某些集合、方法或属性可能不可用。

使用 Field 对象的集合、方法和属性,可以执行以下操作:

  • 使用 Name 属性返回字段的名称。

  • 使用 Value 属性查看或更改字段中的数据。 Value 是 Field 对象的默认属性。

  • 使用 Type、Precision 和 NumericScale 属性返回字段的基本特征。

  • 使用 DefinedSize 属性返回字段的声明大小。

  • 使用 ActualSize 属性返回给定字段中数据的实际大小。

  • 使用 Attribute 属性和 Properties 集合确定给定字段支持哪种类型的功能。

  • 使用 AppendChunk 和 GetChunk 方法操作包含长二进制或长字符数据的字段的值。

如果提供程序支持批量更新,则使用 OriginalValue 和 UnderlyingValue 属性解决批量更新期间字段值的差异。

描述字段

后面的主题将讨论 Field 对象的属性,这些属性表示描述 Field 对象本身的信息,即有关该字段的元数据。 此信息可用于确定 Recordset 的架构。 这些属性包括 Type、DefinedSize、ActualSize、Name、NumericScale 和 Precision。

发现数据类型

Type 属性指示字段的数据类型。 ADO 支持的数据类型枚举常量在 ADO 程序员参考的 DataTypeEnum 中介绍。

对于浮点数值类型(如 adNumeric),可以获取详细信息。 NumericScale 属性指示小数点右侧的多少位将用于表示 Field 的值。 Precision 属性指定用于表示 Field 值的最大位数。

确定字段大小

使用 DefinedSize 属性可以确定 Field 对象的数据容量。

使用 ActualSize 属性可返回 Field 对象值的实际长度。 对于所有字段,ActualSize 属性均为只读。 如果 ADO 无法确定 Field 对象值的长度,ActualSize 属性将返回 adUnknown。

DefinedSize 和 ActualSize 属性有不同的用途。 例如,考虑一个 Field 对象,其声明类型为 adVarChar 且 DefinedSize 属性值为 50,其中包含一个字符。 它返回的 ActualSize 属性值是单个字符的长度(以字节为单位)。

确定字段内容

来自数据源的列的标识符由 Field 的 Name 属性表示。 Field 对象的 Value 属性返回或设置字段的实际数据内容。 这是默认属性。

要更改字段中的数据,请将 Value 属性设置为正确类型的新值。 游标类型必须支持更新以更改字段的内容。 此处的数据库验证未在批处理模式下完成,因此在这种情况下,当调用 UpdateBatch 时,需要检查是否有错误。 某些提供程序还支持 ADO Field 对象的 UnderlyingValue 和 OriginalValue 属性,以帮助在你尝试执行批量更新时解决冲突。 有关如何解决此类冲突的详细信息,请参阅编辑数据

注意

将新 Fields 追加到 Recordset 时,无法设置 Recordset Field 值。 而可以将新 Fields 追加到已关闭的 Recordset。 然后必须打开 Recordset,只有这样才能给这些 Fields 赋值。

获取更多字段信息

ADO 对象有两种类型的属性:内置的和动态。 到目前为止,只讨论了 Field 对象的内置属性。

内置属性是在 ADO 中实现的属性,使用 MyObject.Property 语法可立即用于任何新对象。 它们不显示为对象的 Properties 集合中的 Property 对象。

动态属性由基础数据提供程序定义,并显示在相应 ADO 对象的 Properties 集合中。 例如,特定于提供程序的属性可能指示 Recordset 对象是否支持事务或更新。 这些附加属性将作为 Property 对象显示在 Recordset 对象的 Properties 集合中。 动态属性只能通过集合引用,使用语法 MyObject.Properties(0)MyObject.Properties("Name")

这两种属性都不能删除。

动态 Property 对象具有自己的四个内置属性:

  • Name 属性是标识属性的字符串。

  • Type 属性是指定属性数据类型的整数。

  • Value 属性是包含属性设置的变体。 Value 是 Property 对象的默认属性。

  • Attributes 属性是一个长值,指示提供程序特定的属性的特征。

Field 对象的 Properties 集合包含有关字段的其他元数据。 此集合的内容因提供程序而异。 下面的代码示例检查本部分开头介绍的示例 Recordset 的 Properties 集合。 它首先查看集合的内容。 此代码使用用于 SQL Server 的 OLE DB 提供程序,因此 Properties 集合包含与该提供程序相关的信息。

'BeginFieldProps  
    Dim objProp As ADODB.Property  
  
    For intLoop = 0 To (objFields.Count - 1)  
        Debug.Print objFields.Item(intLoop).Name  
  
        For Each objProp In objFields(intLoop).Properties  
            Debug.Print vbTab & objProp.Name & " = " & objProp.Value  
        Next objProp  
    Next intLoop  
'EndFieldProps  

处理二进制数据

在 Field 对象上使用 AppendChunk 方法借助长二进制或字符数据进行填充。 在系统内存有限的情况下,可以使用 AppendChunk 方法操作部分(而不是整个)长值。

如果 Field 对象的 Attributes 属性中的 adFldLong 位设置为 true,则可以对该字段使用 AppendChunk 方法。

Field 对象的第一个 AppendChunk 调用将数据写入该字段,覆盖任何现有数据。 后续 AppendChunk 调用将添加到现有数据。 如果将数据追加到一个字段,然后在当前记录中设置或读取另一个字段的值,ADO 假定你已完成将数据追加到第一个字段。 如果再次在第一个字段上调用 AppendChunk 方法,ADO 会将调用解释为新的 AppendChunk 操作,并覆盖现有数据。 访问不是首个 Recordset 对象克隆的其他 Recordset 对象中的字段不会中断 AppendChunk 操作。

对 Field 对象使用 GetChunk 方法来检索其部分或全部长二进制或字符数据。 在系统内存有限的情况下,可以使用 GetChunk 方法操作部分(而不是整个)长值。

GetChunk 调用返回的数据会分配给变量。 如果 Size 大于剩余数据,GetChunk 方法仅返回剩余数据,而无需使用空格填充变量。 如果字段为空,GetChunk 方法将返回一个 null 值。

每个后续 GetChunk 调用都会从上一个 GetChunk 调用中断的位置开始检索数据。 但是,如果从一个字段检索数据,随后在当前记录中设置或读取另一个字段的值,ADO 会假定你已经从第一个字段检索完数据。 如果再次对第一个字段调用 GetChunk 方法,ADO 会将调用解释为新的 GetChunk 操作,并从数据的开头开始读取。 访问不是首个 Recordset 对象克隆的其他 Recordset 对象中的字段不会中断 GetChunk 操作。

如果将 Field 对象 Attributes 属性中的 adFldLong 位设置为 True,可以对此字段使用 GetChunk 方法。

如果在对 Field 对象使用 GetChunk 或 AppendChunk 方法时没有当前记录,会出现错误 3021(无当前记录)。

有关使用这些方法来操作二进制数据的示例,请参阅 ADO 程序员参考中的 AppendChunk 方法GetChunk 方法示例。