OdbcDataReader.GetSchemaTable 方法
定義
重要
部分資訊涉及發行前產品,在發行之前可能會有大幅修改。 Microsoft 對此處提供的資訊,不做任何明確或隱含的瑕疵擔保。
傳回 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
傳回
描述資料行中繼資料的 DataTable。
實作
例外狀況
備註
方法會 GetSchemaTable 依下列順序傳回每個數據行的相關元數據:
DataReader 數據行 | 描述 |
---|---|
ColumnName | 數據行的名稱;這可能不是唯一的。 如果無法判斷數據行名稱,則會傳回 Null 值。 此名稱一律會反映目前檢視或命令文字中數據行的最新命名。 |
ColumnOrdinal | 資料行以零為起始的序數。 這個資料行不能包含 null 值。 |
ColumnSize | 資料欄中值的可能長度上限。 對於使用固定長度數據類型的數據行,這是數據類型的大小。 |
NumericPrecision | 如果 DbType 是數值數據類型,則這是數據行的最大精確度。 精確度取決於數據行的定義。 如果 DbType 不是數值數據類型,請勿使用此數據行中的數據。 如果基礎 ODBC 驅動程式傳回非數值數據類型的有效位數值,則會在架構數據表中使用此值。 |
NumericScale | 如果 DbType 為 Decimal,則小數點右邊的數字數目。 否則,這是 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 假設在呼叫其中一個 SQLPrepare、SQLExecute 或 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。 驅動程式也不會傳回主鍵資訊;它只會傳回唯一索引及其數據行的清單,包括主鍵數據行,而不會區分它們。