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 驅動程式傳回非數值數據類型的有效位數值,則會在架構數據表中使用此值。
DataType 對應至 的 DbTypeCommon Language Runtime 類型。
ProviderType 基礎驅動程序類型。
IsLong true 如果數據行包含二進位 Long 物件 (BLOB) 包含非常長的數據。 非常長數據的定義是驅動程式特定的。
AllowDBNull true 如果取用者可以將資料行設定為 Null 值,或驅動程式無法判斷取用者是否可以將資料行設定為 Null 值,則為 。 否則為 false。 資料行可包含 null 值,即使它不得設定為 null 值。
IsReadOnly true 如果無法修改資料列,則為 ;否則為 false
IsRowVersion 如果資料行包含無法寫入的永續性資料列識別碼,且除了識別資料列以外無任何有意義的值,即會設定。
IsUnique true:基表中沒有兩個數據列 (BaseTableName 中傳回的數據表) 可以在此數據行中具有相同的值。 如果資料列本身代表索引鍵,或唯一類型的條件約束僅適用於此資料行,則 IsUnique 保證 true 為 。

false:數據行可以包含基表中的重複值。 此資料列預設值為 false
IsKey true:數據行是數據列集中的一組數據行,可一起唯一識別數據列。 設定為 IsKey true 的數據行集合必須唯一識別數據列集中的數據列。 不需要這組資料行集是最基本的資料行集。 這個數據行集可以從基表主鍵、唯一條件約束或唯一索引產生。

false:數據行不需要唯一識別數據列。
IsAutoIncrement true 如果資料列將值指派給固定增量的新數據列,則為 ;否則為 false。 此資料列預設值為 false
BaseSchemaName 包含資料行之數據源中的架構名稱。 如果無法判斷基底目錄名稱,則為 NULL。 此數據行的預設值為 Null 值。
BaseCatalogName 包含資料行的資料存放區中之目錄名稱。 如果無法判斷基底目錄名稱,則為 NULL。 此數據行的預設值為 Null 值。
BaseTableName 包含此資料行的資料存放區中資料表或檢視中的名稱。 如果無法判斷基底資料表名稱,則為 null 值。 此數據行的預設值為 Null 值。
BaseColumnName 在資料存放區中的資料行名稱。 如果使用別名,這可能與 ColumnName 資料行中傳回的數據行名稱不同。 如果無法判斷基底數據行名稱或數據列集數據行的衍生,但與數據存放區中的數據行不同,則為 Null 值。 此數據行的預設值為 Null 值。

結果集中的每個數據行都會傳回一個數據列。

.NET Framework DATA Provider for ODBC 假設在呼叫其中一個 SQLPrepareSQLExecute 或 SQLExecuteDirect 函式之後,可從 ODBC 驅動程式取得元數據資訊。 若要讓 「SchemaOnly」 命令行為正常運作, SQLPrepare 必須傳回必要的元數據資訊。 並非所有 ODBC 驅動程式都支援此函式或傳回元數據資訊。 在這些情況下,SchemaTable 中的部分或所有信息都會遺失。 呼叫 SQLPrepare 之後,數據提供者會呼叫 ODBC SQLColAttribute 函式,以尋找查詢 (結果中每個數據行相關的元數據資訊,例如 IsLong、IsUnique、AllowDBNull、BaseTableName、BaseColumnName) 。 如果基礎驅動程式未傳回部分此資訊,則 SchemaTable 中的對應值將不會正確設定。

.NET Framework DATA Provider for ODBC 也會呼叫 SQLPrimaryKeys,以擷取每個數據表的索引鍵資訊。 如果基礎 ODBC 驅動程式不支援此函式,數據提供者會呼叫 SQLStatistics ,並選擇其中一個唯一索引做為數據表的主鍵。 這不一定會提供您想要的結果。

OdbcCommandBuilder 需要正確識別數據表的主鍵,才能正常運作。 如果未針對查詢結果中的每個數據行傳回BaseTableName,則 .NET Framework Data Provider for ODBC 會嘗試剖析 SQL 語句,以尋找查詢中涉及的數據表名稱。 這適用於UPDATE、INSERT、DELETE和簡單的SELECT語句,但不適用於以聯結為基礎的預存程式或SELECT語句。 如果此數據表遺漏部分或所有架構資訊, OdbcCommandBuilder 將無法正常運作,因為它的架構資訊不足,無法自動產生正確的 INSERT、UPDATE 或 DELETE 語句。

若要確定元資料行傳回正確的資訊,您必須使用設定為 KeyInfo 的行為參數來呼叫 ExecuteReader 。 否則,架構數據表中的某些數據行可能會傳回預設、Null 或不正確的數據。

當您透過 ODBC 驅動程式使用 ODBC.NET Oracle 時,別名索引鍵數據行無法辨識為索引鍵。 這會影響 OdbcDataReader 架構數據表中的 IsKey 和 IsUnique 資料行。 它也會影響 OdbcCommandBuilder 產生更新邏輯的能力。 請考慮不使用主鍵數據行的別名。

注意

不論其是否可為 Null,Microsoft Jet ODBC 驅動程式一律會將唯一索引和主鍵數據行傳回為可為 Null。 驅動程式也不會傳回主鍵資訊;它只會傳回唯一索引及其數據行的清單,包括主鍵數據行,而不會區分它們。

適用於

另請參閱