OdbcDataReader.GetSchemaTable 方法

定义

返回一个描述列元数据的 DataTable.OdbcDataReader

public:
 override System::Data::DataTable ^ GetSchemaTable();
public:
 virtual System::Data::DataTable ^ GetSchemaTable();
public override System.Data.DataTable? GetSchemaTable();
public System.Data.DataTable GetSchemaTable();
public override System.Data.DataTable GetSchemaTable();
override this.GetSchemaTable : unit -> System.Data.DataTable
abstract member GetSchemaTable : unit -> System.Data.DataTable
override this.GetSchemaTable : unit -> System.Data.DataTable
Public Overrides Function GetSchemaTable () As DataTable
Public Function GetSchemaTable () As DataTable

返回

描述列元数据的 A DataTable

实现

例外

注解

该方法 GetSchemaTable 按以下顺序返回有关每个列的元数据:

DataReader 列 Description
ColumnName 列的名称;这可能不是唯一的。 如果无法确定列名,则返回 null 值。 此名称始终反映当前视图或命令文本中列的最新命名。
ColumnOrdinal 列的从零开始的序号。 此列不能包含 null 值。
列大小 列中值的最大可能长度。 对于使用固定长度数据类型的列,这是数据类型的大小。
NumericPrecision 如果 DbType 为数值数据类型,则为列的最大精度。 精度取决于列的定义。 如果 DbType 不是数值数据类型,请不要使用此列中的数据。 如果基础 ODBC 驱动程序返回非数值数据类型的精度值,则此值在架构表中使用。
NumericScale DbType如果是Decimal,则小数点右侧的数字数。 否则,此值为 null 值。 如果基础 ODBC 驱动程序返回非数值数据类型的精度值,则此值在架构表中使用。
数据类型 映射到公共语言运行时类型 DbType
ProviderType 基础驱动程序类型。
IsLong true 如果列包含包含很长数据的二进制长对象(BLOB)。 很长的数据的定义特定于驱动程序。
AllowDBNull true 如果使用者可以将列设置为 null 值,或者驱动程序无法确定使用者是否可以将列设置为 null 值, 否则为 false。 即使列不能设置为 null 值,列也可能包含 null 值。
IsReadOnly true 如果无法修改列,则为否则 false
IsRowVersion 如果列包含无法写入到的永久性行标识符,并且除了标识行之外没有有意义的值,则设置该列。
IsUnique true:基表中没有两行(BaseTableName 中返回的表)在此列中具有相同的值。 如果列本身表示键,或者是否存在仅适用于此列的 UNIQUE 类型的约束,则保证 true IsUnique。

false:列可以包含基表中的重复值。 此列的默认值为 false
IsKey true:该列是行集中的一组列之一,该列一起唯一标识该行。 设置为 IsKey true 的列集必须唯一标识行集中的行。 不需要此列集是最小列集。 可以从基表主键、唯一约束或唯一索引生成这组列。

false:列不需要唯一标识行。
IsAutoIncrement true 如果列以固定增量将值分配给新行,否则 false。 此列的默认值为 false
BaseSchemaName 包含列的数据源中的架构的名称。 如果无法确定基目录名称,则为 NULL。 此列的默认值为 null 值。
BaseCatalogName 包含列的数据存储区中的目录的名称。 如果无法确定基目录名称,则为 NULL。 此列的默认值为 null 值。
BaseTableName 包含列的数据存储中的表或视图的名称。 如果无法确定基表名称,则为 null 值。 此列的默认值为 null 值。
BaseColumnName 数据存储中列的名称。 如果使用别名,则这可能不同于 ColumnName 列中返回的列名。 如果无法确定基列名,或者行集列派生但与数据存储中的列不同,则为 null 值。 此列的默认值为 null 值。

为结果集中的每一列返回一行。

ODBC 的 .NET Framework Data Provider假定在调用 SQLPrepareSQLExecuteSQLExecuteDirect2 函数之一后,可从 ODBC 驱动程序获取元数据信息。 若要使“SchemaOnly”命令行为正常工作, SQLPrepare 必须返回所需的元数据信息。 并非所有 ODBC 驱动程序都支持此函数或返回元数据信息。 在这些情况下,架构表中的部分或全部信息将丢失。 调用 SQLPrepare 后,数据提供程序调用 ODBC SQLColAttribute 函数以查找与查询结果中的每个列相关的元数据信息(例如 IsLong、IsUnique、AllowDBNull、BaseTableName、BaseColumnName)。 如果基础驱动程序未返回某些信息,则 SchemaTable 中的相应值将不会正确设置。

ODBC 的 .NET Framework Data Provider 还调用 SQLPrimaryKeys来检索每个表的关键信息。 如果基础 ODBC 驱动程序不支持此函数,数据提供程序将调用 SQLStatistics ,并选择其中一个唯一索引作为表的主键。 这可能并不总是提供所需的结果。

OdbcCommandBuilder 需要正确标识表的主键才能正常工作。 如果未为查询结果中的每个列返回 BaseTableName,则 ODBC .NET Framework Data Provider会尝试分析 SQL 语句以查找查询中涉及的表名。 这适用于 UPDATE、INSERT、DELETE 和简单的 SELECT 语句,但不适用于基于联接的存储过程或 SELECT 语句。 如果此表中缺少某些或所有架构信息,则 OdbcCommandBuilder 将无法正常工作,因为它的架构信息不足,无法自动生成正确的 INSERT、UPDATE 或 DELETE 语句。

若要确保元数据列返回正确的信息,必须使用设置为 KeyInfo 的行为参数进行调用 ExecuteReader 。 否则,架构表中的某些列可能会返回默认、null 或不正确的数据。

使用 ODBC 时.NET通过 ODBC 驱动程序将别名键列识别为 Oracle 时,不会识别为键。 这会影响 OdbcDataReader 架构表中的 IsKey 和 IsUnique 列。 它还会影响 OdbcCommandBuilder 生成更新逻辑的能力。 请考虑不使用主键列的别名。

注释

Microsoft Jet ODBC 驱动程序始终将唯一索引和主键列作为可为 null 返回,而不考虑它们是否可为 null。 驱动程序也不会返回主键信息;它仅返回唯一索引及其列的列表,包括主键列,而不区分它们。

适用于

另请参阅