OdbcDataReader.GetSchemaTable 方法

定义

返回一个 DataTable,它描述 OdbcDataReader 的列元数据。

public:
 override System::Data::DataTable ^ GetSchemaTable();
public:
 virtual System::Data::DataTable ^ GetSchemaTable();
public override System.Data.DataTable GetSchemaTable ();
public override System.Data.DataTable? GetSchemaTable ();
public 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

返回

一个描述列元数据的 DataTable

实现

例外

注解

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

DataReader 列 说明
ColumnName 列的名称;这可能不是唯一的。 如果无法确定列名,则返回 null 值。 此名称始终反映当前视图或命令文本中列的最新命名。
ColumnOrdinal 从零开始的列序号。 此列不能包含 NULL 值。
ColumnSize 列中值的最大可能长度。 对于使用固定长度数据类型的列,这是数据类型的大小。
NumericPrecision 如果 DbType 是数值数据类型,则表示列的最大精度。 精度取决于列的定义。 如果 DbType 不是数值数据类型,请不要使用此列中的数据。 如果基础 ODBC 驱动程序返回非数值数据类型的精度值,则会在架构表中使用此值。
NumericScale 如果 DbTypeDecimal,则为小数点右侧的位数。 否则,此值为 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数据提供程序假定在调用 SQLPrepareSQLExecute 或 SQLExecuteDirect 函数之一后,可从 ODBC 驱动程序获取元数据信息。 若要使“SchemaOnly”命令行为正常工作, SQLPrepare 必须返回所需的元数据信息。 并非所有 ODBC 驱动程序都支持此函数或返回元数据信息。 在这些情况下,将缺少 SchemaTable 中的部分或全部信息。 调用 SQLPrepare 后,数据提供程序调用 ODBC SQLColAttribute 函数以查找与查询结果 (每个列相关的元数据信息,例如 IsLong、IsUnique、AllowDBNull、BaseTableName、BaseColumnName) 。 如果基础驱动程序未返回某些此信息,则不会正确设置 SchemaTable 中的相应值。

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

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

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

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

注意

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

适用于

另请参阅