SQLColAttribute 函式

一致性
引進版本:ODBC 3.0 標準合規性:ISO 92

摘要
SQLColAttribute 會傳回結果集中資料行的描述項資訊。 描述項資訊會以字元字串、描述元相依值或整數值的形式傳回。

注意

如需 Driver Manager 在 ODBC 3 時將此函式對應至之內容的詳細資訊。 x 應用程式正在使用 ODBC 2。 x 驅動程式,請參閱 對應替代函式以取得應用程式的 回溯相容性。

語法

  
SQLRETURN SQLColAttribute (  
      SQLHSTMT        StatementHandle,  
      SQLUSMALLINT    ColumnNumber,  
      SQLUSMALLINT    FieldIdentifier,  
      SQLPOINTER      CharacterAttributePtr,  
      SQLSMALLINT     BufferLength,  
      SQLSMALLINT *   StringLengthPtr,  
      SQLLEN *        NumericAttributePtr);  

引數

StatementHandle
[輸入]語句控制碼。

ColumnNumber
[輸入]要從中擷取域值之 IRD 中的記錄數目。 這個引數會對應至結果資料的資料行編號,從 1 開始,依序依序排序。 資料行可以依任何順序加以描述。

資料行 0 可以在這個引數中指定,但除了SQL_DESC_TYPE和SQL_DESC_OCTET_LENGTH以外的所有值都會傳回未定義的值。

FieldIdentifier
[輸入]描述項控制碼。 此控制碼會定義應查詢 IRD 中的欄位(例如,SQL_COLUMN_TABLE_NAME)。

CharacterAttributePtr
[輸出]緩衝區的指標,如果欄位是字元字串,則會傳回 IRD 之 ColumnNumber 資料列之 FieldIdentifier 欄位中 的值 。 否則,欄位不會使用。

如果 CharacterAttributePtr 為 Null, StringLengthPtr 仍會傳回字元總數(不包括字元資料的 Null 終止字元),以在 CharacterAttributePtr 所指向 的緩衝區中傳 回。

BufferLength
[輸入]如果 FieldIdentifier 是 ODBC 定義的欄位, 且 CharacterAttributePtr 指向字元字串或二進位緩衝區,則此引數應該是 * CharacterAttributePtr 的長度。 如果 FieldIdentifier 是 ODBC 定義的欄位,而 * CharacterAttribute Ptr 是整數,則會忽略此欄位。 如果 *CharacterAttributePtr 是 Unicode 字串(呼叫 SQLColAttributeW 時), BufferLength 引數必須是偶數。 如果 FieldIdentifier 是驅動程式定義的欄位,應用程式會藉由設定 BufferLength 引數,將欄位的性質指示給驅動程式管理員。 BufferLength 可以具有下列值:

  • 如果 CharacterAttributePtr 是指標的指標, BufferLength 應該具有值SQL_IS_POINTER。

  • 如果 CharacterAttributePtr 是字元字串的指標, BufferLength 就是緩衝區的長度。

  • 如果 CharacterAttributePtr 是二進位緩衝區的指標,則應用程式會將SQL_LEN_BINARY_ATTR( length ) 宏的結果放在 BufferLength 。 這會在 BufferLength 放置負值。

  • 如果 CharacterAttributePtr 是固定長度資料類型的指標, BufferLength 必須是下列其中一項:SQL_IS_INTEGER、SQL_IS_UINTEGER、SQL_IS_SMALLINT或SQL_IS_USMALLINT。

StringLengthPtr
[輸出]緩衝區的指標,用來傳回可用 * CharacterAttributePtr 傳回的位元組總數(不包括字元資料的 Null 終止位元組)。

針對字元資料,如果可用的位元組數目大於或等於 BufferLength,則 * CharacterAttributePtr 中的描述項資訊會截斷為 BufferLength 減去 Null 終止字元的長度,且由驅動程式以 Null 終止。

對於所有其他資料類型的資料,會忽略 BufferLength 的值 ,而驅動程式會假設 * CharacterAttributePtr 的大小為 32 位。

NumericAttributePtr
[輸出]整數緩衝區的指標,如果欄位是數值描述元類型,則會傳回 IRD 之 ColumnNumber 資料列之 FieldIdentifier 欄位中 的值 ,例如SQL_DESC_COLUMN_LENGTH。 否則,欄位不會使用。 請注意,某些驅動程式可能只寫入較低 32 位或 16 位的緩衝區,並將較高順序的位維持不變。 因此,應用程式應該先將值初始化為 0,再呼叫此函式。

傳回

SQL_SUCCESS、SQL_SUCCESS_WITH_INFO、SQL_STILL_EXECUTING、SQL_ERROR或SQL_INVALID_HANDLE。

診斷

當 SQLColAttribute 傳回SQL_ERROR或SQL_SUCCESS_WITH_INFO時 ,可能會呼叫 具有 SQL_HANDLE_STMT HandleType 和 StatementHandle Handle HandleType 來取得相關聯的 SQLSTATE 值。 下表列出 SQLColAttribute 通常傳 回的 SQLSTATE 值,並說明此函式內容中的每個值;標記法 「(DM)」 在驅動程式管理員傳回的 SQLSTATE 描述之前。 除非另有說明,否則與每個 SQLSTATE 值相關聯的傳回碼會SQL_ERROR。

SQLSTATE 錯誤 描述
01000 一般警告 驅動程式特定的資訊訊息。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
01004 字串資料,右截斷 緩衝區 * CharacterAttributePtr 不夠大,無法傳回整個字串值,因此字串值已截斷。 未建構字串值的長度會在 * StringLengthPtr 中 傳回。 (函式會傳回SQL_SUCCESS_WITH_INFO。)
07005 備妥語句不是資料 指標規格 StatementHandle 相關聯的語句未傳回結果集,而且 FieldIdentifier 未SQL_DESC_COUNT。 沒有資料行可描述。
07009 不正確描述元索引 (DM) ColumnNumber 指定的 值等於 0,且SQL_ATTR_USE_BOOKMARKS語句屬性SQL_UB_OFF。

為引數 ColumnNumber 指定的值大於結果集中的資料行數目。
HY000 一般錯誤 發生錯誤,其中沒有特定的 SQLSTATE,也沒有定義任何實作特定的 SQLSTATE。 SQLGetDiagField 從診斷資料結構傳 回的錯誤訊息描述錯誤及其原因。
HY001 記憶體配置錯誤 驅動程式無法配置支援執行或完成函式所需的記憶體。
HY008 作業已取消 已針對 StatementHandle 啟用非同步處理。 已呼叫函式,並在完成執行之前, 在 StatementHandle 上 呼叫 SQLCancel SQLCancelHandle 。 然後在 StatementHandle 再次呼叫函式。

呼叫函式,並在完成執行之前, 從多執行緒應用程式中的不同執行緒呼叫 語句Handle 或 SQLCancelHandle
HY010 函式順序錯誤 (DM) 已針對與 StatementHandle 相關聯的連接控制碼呼叫非同步執行函式。 呼叫 SQLColAttribute 時,這個非同步函式仍在執行中。

(DM) 已針對 StatementHandle 呼叫 SQLExecute SQLExecDirect SQLMoreResults ,並傳回SQL_PARAM_DATA_AVAILABLE。 在擷取所有資料流程參數的資料之前,會呼叫此函式。

(DM) 在呼叫 SQLPrepare SQLExecDirect 或 StatementHandle 目錄函式之前呼叫函式。

(DM) 呼叫 StatementHandle 的非同步執行函式(而非此函式),並在呼叫此函式時仍在執行中。

(DM) 已針對 StatementHandle 呼叫 SQLExecute SQLExecDirect SQLBulkOperations SQLSetPos ,並傳回SQL_NEED_DATA。 在針對所有資料執行中參數或資料行傳送資料之前,會呼叫此函式。
HY013 記憶體管理錯誤 無法處理函式呼叫,因為基礎記憶體物件無法存取,可能是因為記憶體不足的情況。
HY090 不正確字串或緩衝區長度 (DM) *CharacterAttributePtr 是字元字串,BufferLength 小於 0,但不等於SQL_NTS。
HY091 不正確描述元欄位識別碼 針對 FieldIdentifier 引數 指定的值不是其中一個定義的值,而且不是實作定義的值。
HY117 連線因為未知的交易狀態而暫停。 只允許中斷連線和唯讀函式。 (DM) 如需暫停狀態的詳細資訊,請參閱 SQLEndTran 函式
HYC00 驅動程式無法使用 驅動程式不支援為引數 FieldIdentifier 指定的值。
HYT01 已超過連線逾時 在資料來源回應要求之前,連線逾時期限已過期。 連線逾時期間是透過 SQLSetConnectAttr 來設定,SQL_ATTR_CONNECTION_TIMEOUT。
IM001 驅動程式不支援此函式 (DM) 與 StatementHandle 相關聯的驅動程式不支援 函式。
IM017 在非同步通知模式中停用輪詢 每當使用通知模型時,輪詢就會停用。
IM018 尚未呼叫 SQLCompleteAsync ,以完成此控制碼上的先前非同步作業。 如果控制碼上的上一個函式呼叫傳回SQL_STILL_EXECUTING且啟用通知模式, 則必須在控制碼上呼叫 SQLCompleteAsync ,才能執行後續處理並完成作業。

在 SQLPrepare 之後和 SQLExecute 之前 呼叫時 SQLColAttribute 可以傳回 SQLPrepare SQLExecute 可傳回 的任何 SQLSTATE,視資料來源評估與 StatementHandle 相關聯的 SQL 語句而定。

基於效能考慮,應用程式在執行語句之前不應該呼叫 SQLColAttribute

註解

如需應用程式如何使用 SQLColAttribute 傳 回的資訊,請參閱 結果集中繼資料

SQLColAttribute 會傳回 * NumericAttributePtr 或 * CharacterAttributePtr 中的資訊。 整數資訊會在 * NumericAttributePtr 中傳回為 SQLLEN 值;所有其他資訊格式都會以 * CharacterAttributePtr 傳 回。 當 * NumericAttributePtr 中傳回信息時,驅動程式會 忽略 CharacterAttributePtr BufferLength StringLengthPtr 。 當 * CharacterAttributePtr 中傳回信息時,驅動程式會 忽略 NumericAttributePtr

SQLColAttribute 會從 IRD 的描述元欄位傳回值。 函式是使用語句控制碼呼叫,而不是描述元控制碼。 SQLColAttribute 針對本節稍後所列的 FieldIdentifier 值所 傳回的值,也可以使用適當的 IRD 控制碼呼叫 SQLGetDescField 來擷取。

目前定義的描述元欄位、其引進的 ODBC 版本,以及會為其傳回信息的引數,稍後會在本節中顯示:驅動程式可能會定義更多描述元類型,以利用不同的資料來源。

ODBC 3。 x 驅動程式必須傳回每個描述元欄位的值。 如果描述項欄位不適用於驅動程式或資料來源,除非另有說明,否則驅動程式會在 *StringLengthPtr 中傳回 0,或在 * CharacterAttributePtr 中傳回空字串。

回溯相容性

ODBC 3。 x 函式 SQLColAttribute 會取代已被取代的 ODBC 2。 x 函式 SQLColAttributes 。 將 SQLColAttributes 對應 SQLColAttribute 時(當 ODBC 2 時。 x 應用程式正在使用 ODBC 3。 x 驅動程式),或將 SQLColAttribute 對應至 SQLColAttributes (當 ODBC 3 時。 x 應用程式正在使用 ODBC 2。 x 驅動程式),驅動程式管理員會透過 傳遞 FieldIdentifier 的值 、將它對應至新的值,或傳回錯誤,如下所示:

注意

ODBC 3 中 FieldIdentifier 值中使用的 前置詞。 x 已從 ODBC 2 中使用的變更。 x . 新的前置詞為 「SQL_DESC」;舊的前置詞是 「SQL_COLUMN」。

  • 如果 ODBC 2 的 #define 值。 x FieldIdentifier ODBC 3 的 #define 值相同。 x FieldIdentifier ,函式呼叫中的值只會通過。

  • ODBC 2 的 #define 值。 x FieldIdentifiers SQL_COLUMN_LENGTH、SQL_COLUMN_PRECISION和SQL_COLUMN_SCALE與 ODBC 3 的 #define 值不同 x FieldIdentifiers SQL_DESC_PRECISION、SQL_DESC_SCALE 和 SQL_DESC_LENGTH。 ODBC 2。 x 驅動程式只需要支援 ODBC 2。 x 值。 ODBC 3。 x 驅動程式必須同時支援這三 個 FieldIdentifier 的 「SQL_COLUMN」 和 「SQL_DESC」 值。 這些值不同,因為 ODBC 3 中以不同的方式定義有效位數、小數位數和長度。 x 比他們在 ODBC 2 中還要多。 x . 如需詳細資訊,請參閱 資料行大小、十進位數、傳輸八進位長度和顯示大小

  • 如果 ODBC 2 的 #define 值。 x FieldIdentifier ODBC 3 #define 值不同。 x FieldIdentifier ,如同 COUNT、NAME 和 NullABLE 值所發生,函式呼叫中的值會對應至對應的值。 例如,SQL_COLUMN_COUNT會對應至SQL_DESC_COUNT,而SQL_DESC_COUNT會根據對應的方向對應至SQL_COLUMN_COUNT。

  • 如果 FieldIdentifier 是 ODBC 3 中的新值。 x ,其中 ODBC 2 中沒有對應的值。 x ,當 ODBC 3 時,它不會對應。 x 應用程式會在 ODBC 2 中呼叫 SQLColAttribute 時使用它。 x 驅動程式,而且呼叫會傳回 SQLSTATE HY091 (不正確描述元欄位識別碼)。

下表列出 SQLColAttribute 所 傳回的 描述元類型。 NumericAttributePtr 值的型 別為 SQLLEN *

FieldIdentifier 資訊

在 中傳回
描述
SQL_DESC_AUTO_UNIQUE_VALUE (ODBC 1.0) NumericAttributePtr 如果資料行是自動增加資料行,SQL_TRUE。

如果資料行不是自動增加資料行或不是數值,SQL_FALSE。

此欄位僅適用于數值資料類型資料行。 應用程式可以將值插入包含自動增加資料行的資料列中,但通常無法更新資料行中的值。

在自動增加資料行中插入時,會在插入時插入資料行中唯一值。 未定義增量,但為數據源特定。 應用程式不應該假設自動增加資料行從任何特定點開始,或以任何特定值遞增。
SQL_DESC_BASE_COLUMN_NAME (ODBC 3.0) CharacterAttributePtr 結果集資料行的基底資料行名稱。 如果基底資料行名稱不存在(就運算式的資料行而言),則此變數會包含空字串。

此資訊會從 IRD 的 SQL_DESC_BASE_COLUMN_NAME 記錄欄位傳回,這是唯讀欄位。
SQL_DESC_BASE_TABLE_NAME (ODBC 3.0) CharacterAttributePtr 包含資料行的基表名稱。 如果無法定義或不適用基表名稱,則此變數會包含空字串。

此資訊會從 IRD 的SQL_DESC_BASE_TABLE_NAME記錄欄位傳回,這是唯讀欄位。
SQL_DESC_CASE_SENSITIVE (ODBC 1.0) NumericAttributePtr 如果資料行被視為區分大小寫的定序和比較,SQL_TRUE。

如果資料行未被視為區分大小寫的定序和比較,或為非字元,則SQL_FALSE。
SQL_DESC_CATALOG_NAME (ODBC 2.0) CharacterAttributePtr 包含資料行之資料表的目錄。 如果資料行是運算式,或是資料行是檢視的一部分,則傳回的值是實作定義的。 如果資料來源不支援目錄或無法判斷目錄名稱,則會傳回空字串。 此 VARCHAR 記錄欄位不限於 128 個字元。
SQL_DESC_CONCISE_TYPE (ODBC 1.0) NumericAttributePtr 簡潔的資料類型。

針對 datetime 和 interval 資料類型,此欄位會傳回精簡的資料類型;例如,SQL_TYPE_TIME或SQL_INTERVAL_YEAR。 (如需詳細資訊,請參閱 附錄 D:資料類型中的資料類型識別碼和描述元 。)

此資訊會從 IRD 的SQL_DESC_CONCISE_TYPE記錄欄位傳回。
SQL_DESC_COUNT (ODBC 1.0) NumericAttributePtr 結果集中可用的資料行數目。 如果結果集中沒有資料行,這會傳回 0。 ColumnNumber 引數中的 值會被忽略。

此資訊會從 IRD 的SQL_DESC_COUNT標頭欄位傳回。
SQL_DESC_DISPLAY_SIZE (ODBC 1.0) NumericAttributePtr 顯示資料行資料所需的字元數上限。 如需顯示大小的詳細資訊,請參閱 附錄 D:資料類型中的資料行大小、十進位數、傳輸八位長度和顯示大小
SQL_DESC_FIXED_PREC_SCALE (ODBC 1.0) NumericAttributePtr SQL_TRUE,如果資料行具有固定有效位數和非零小數位數,則為數據源特定。

SQL_FALSE如果資料行沒有固定有效位數和非零小數位數,則為數據源特定。
SQL_DESC_LABEL (ODBC 2.0) CharacterAttributePtr 資料行標籤或標題。 例如,名為 EmpName 的資料行可能會標示為員工名稱,或可能以別名加上標籤。

如果資料行沒有標籤,則會傳回資料行名稱。 如果資料行未標記且未命名,則會傳回空字串。
SQL_DESC_LENGTH (ODBC 3.0) NumericAttributePtr 數值,其為字元字串或二進位資料類型的最大或實際字元長度。 它是固定長度資料類型的最大字元長度,或可變長度資料類型的實際字元長度。 其值一律會排除結束字元字串的 Null 終止位元組。

此資訊會從 IRD 的SQL_DESC_LENGTH記錄欄位傳回。

如需長度的詳細資訊,請參閱 附錄 D:資料類型中的資料行大小、小數位數、傳輸八位長度和顯示大小
SQL_DESC_LITERAL_PREFIX (ODBC 3.0) CharacterAttributePtr 此 VARCHAR(128) 記錄欄位包含驅動程式辨識為此資料類型常值前置詞的字元或字元。 此欄位包含不適用常值前置詞之資料類型的空字串。 如需詳細資訊,請參閱 常值前置詞和尾碼
SQL_DESC_LITERAL_SUFFIX (ODBC 3.0) CharacterAttributePtr 此 VARCHAR(128) 記錄欄位包含驅動程式辨識為此資料類型常值尾碼的字元或字元。 此欄位包含不適用常值尾碼之資料類型的空字串。 如需詳細資訊,請參閱 常值前置詞和尾碼
SQL_DESC_LOCAL_TYPE_NAME (ODBC 3.0) CharacterAttributePtr 此 VARCHAR(128) 記錄欄位包含資料類型的任何當地語系化(原生語言)名稱,可能與資料類型的一般名稱不同。 如果沒有當地語系化的名稱,則會傳回空字串。 此欄位僅供顯示之用。 字串的字元集是地區設定相依的,通常是伺服器的預設字元集。
SQL_DESC_NAME (ODBC 3.0) CharacterAttributePtr 如果套用資料行別名,則為 。 如果資料行別名不適用,則會傳回資料行名稱。 不論是哪一種情況,SQL_DESC_UNNAMED都設定為 SQL_NAMED。 如果沒有資料行名稱或資料行別名,則會傳回空字串,並將SQL_DESC_UNNAMED設定為 SQL_UNNAMED。

此資訊會從 IRD 的SQL_DESC_NAME記錄欄位傳回。
SQL_DESC_NullABLE (ODBC 3.0) NumericAttributePtr 如果資料行可以有 Null 值,SQL_ NullABLE;如果資料行沒有 Null 值,SQL_NO_NullS;如果不知道資料行是否接受 Null 值,或SQL_NullABLE_UNKNOWN。

此資訊會從 IRD 的 SQL_DESC_NullABLE 記錄欄位傳回。
SQL_DESC_NUM_PREC_RADIX (ODBC 3.0) NumericAttributePtr 如果 [SQL_DESC_TYPE] 欄位中的資料類型是近似數值資料類型,則此 SQLINTEGER 欄位會包含值 2,因為SQL_DESC_PRECISION欄位包含位數。 如果 [SQL_DESC_TYPE] 欄位中的資料類型是確切的數值資料類型,則此欄位會包含 10 的值,因為SQL_DESC_PRECISION欄位包含小數位數的數目。 此欄位會針對所有非數值資料類型設定為 0。
SQL_DESC_OCTET_LENGTH (ODBC 3.0) NumericAttributePtr 字元字串或二進位資料類型的長度,以位元組為單位。 對於固定長度字元或二進位類型,這是以位元組為單位的實際長度。 對於可變長度字元或二進位類型,這是位元組的最大長度。 這個值不包含 Null 結束字元。

此資訊會從 IRD 的SQL_DESC_OCTET_LENGTH記錄欄位傳回。

如需長度的詳細資訊,請參閱 附錄 D:資料類型中的資料行大小、小數位數、傳輸八位長度和顯示大小
SQL_DESC_PRECISION (ODBC 3.0) NumericAttributePtr 數值資料類型的數值表示適用的有效位數。 對於資料類型SQL_TYPE_TIME、SQL_TYPE_TIMESTAMP,以及代表時間間隔的所有間隔資料類型,其值是小數秒元件的適用有效位數。

此資訊會從 IRD 的SQL_DESC_PRECISION記錄欄位傳回。
SQL_DESC_SCALE (ODBC 3.0) NumericAttributePtr 數值,這個數值是數值資料類型適用的小數位數。 針對 DECIMAL 和 NUMERIC 資料類型,這是已定義的小數位數。 它未定義給所有其他資料類型。

此資訊會從 IRD 的 SCALE 記錄欄位傳回。
SQL_DESC_SCHEMA_NAME (ODBC 2.0) CharacterAttributePtr 包含資料行之資料表的架構。 如果資料行是運算式,或是資料行是檢視的一部分,則傳回的值是實作定義的。 如果資料來源不支援架構或無法判斷架構名稱,則會傳回空字串。 此 VARCHAR 記錄欄位不限於 128 個字元。
SQL_DESC_SEARCHABLE (ODBC 1.0) NumericAttributePtr 如果資料行不能用於 WHERE 子句,SQL_PRED_NONE。 (這與 ODBC 2 中的SQL_UNSEARCHABLE值相同。 x .)

SQL_PRED_CHAR如果資料行可用於 WHERE 子句,但只能搭配 LIKE 述詞使用。 (這與 ODBC 2 中的SQL_LIKE_ONLY值相同。 x .)

SQL_PRED_BASIC如果資料行可用於 WHERE 子句中,除了 LIKE 以外的所有比較運算子。 (這與 ODBC 2 中的SQL_EXCEPT_LIKE值相同。 x .)

SQL_PRED_SEARCHABLE,如果資料行可用於 WHERE 子句中具有任何比較運算子。

類型為SQL_LONGVARCHAR和SQL_LONGVARBINARY的資料行通常會傳回SQL_PRED_CHAR。
SQL_DESC_TABLE_NAME (ODBC 2.0) CharacterAttributePtr 包含資料行的資料表名稱。 如果資料行是運算式,或是資料行是檢視的一部分,則傳回的值是實作定義的。

如果無法判斷資料表名稱,則會傳回空字串。
SQL_DESC_TYPE (ODBC 3.0) NumericAttributePtr 指定 SQL 資料類型的數值。

當 ColumnNumber 等於 0 時 ,會針對可變長度書簽傳回SQL_BINARY,而固定長度書簽則會傳回SQL_INTEGER。

對於 datetime 和 interval 資料類型,此欄位會傳回詳細資訊資料類型:SQL_DATETIME或SQL_INTERVAL。 (如需詳細資訊,請參閱 附錄 D:資料類型中的資料類型識別碼和描述項

此資訊會從 IRD 的SQL_DESC_TYPE記錄欄位傳回。 注意: 若要針對 ODBC 2 運作。 x 驅動程式,請改用 SQL_DESC_CONCISE_TYPE。
SQL_DESC_TYPE_NAME (ODBC 1.0) CharacterAttributePtr 資料來源相依資料類型名稱;例如,「CHAR」、「VARCHAR」、「MONEY」、「LONG VARBINARY」 或 「CHAR ( ) FOR BIT DATA」。

如果類型未知,則會傳回空字串。
SQL_DESC_UNNAMED (ODBC 3.0) NumericAttributePtr SQL_NAMED或SQL_UNNAMED。 如果 IRD 的SQL_DESC_NAME欄位包含資料行別名或資料行名稱,則會傳回SQL_NAMED。 如果沒有資料行名稱或資料行別名,則會傳回SQL_UNNAMED。

此資訊會從 IRD 的SQL_DESC_UNNAMED記錄欄位傳回。
SQL_DESC_UNSIGNED (ODBC 1.0) NumericAttributePtr 如果資料行不帶正負號(或不是數值),SQL_TRUE。

如果資料行已簽署,SQL_FALSE。
SQL_DESC_UPDATABLE (ODBC 1.0) NumericAttributePtr 資料行是由所定義常數的值所描述:

SQL_ATTR_READONLY SQL_ATTR_WRITE SQL_ATTR_READWRITE_UNKNOWN

SQL_DESC_UPDATABLE描述結果集中資料行的可更新性,而不是基表中的資料行。 結果集資料行所依據之基底資料行的可更新性可能與此欄位中的值不同。 資料行是否可以根據資料類型、使用者許可權和結果集本身的定義來更新。 如果不清楚資料行是否可更新,則應該傳回SQL_ATTR_READWRITE_UNKNOWN。

SQLColAttribute 是 SQLDescribeCol 的可延伸替代方案 SQLDescribeCol 會根據 ANSI-89 SQL 傳回一組固定描述元資訊。 SQLColAttribute 可讓您存取 ANSI SQL-92 和 DBMS 廠商延伸模組中可用的更廣泛的描述元資訊集。

如需下列資訊 請參閱
將緩衝區系結至結果集中的資料行 SQLBindCol 函式
取消語句處理 SQLCancel 函式
傳回結果集中資料行的相關資訊 SQLDescribeCol 函式
擷取資料區塊或捲動結果集 SQLFetchScroll 函式
擷取多個資料列 SQLFetch 函式

範例

下列範例程式碼不會釋放控制碼和連線。 如需可釋放控制碼和語句的程式碼範例,請參閱 SQLFreeHandle 函式 範例 ODBC 程式和 SQLFreeStmt 函 式。

// SQLColAttibute.cpp  
// compile with: user32.lib odbc32.lib  
  
#define UNICODE  
  
#include <windows.h>  
#include <sqlext.h>  
#include <strsafe.h>  
  
struct DataBinding {  
   SQLSMALLINT TargetType;  
   SQLPOINTER TargetValuePtr;  
   SQLINTEGER BufferLength;  
   SQLLEN StrLen_or_Ind;  
};  
  
void printStatementResult(SQLHSTMT hstmt) {  
   int bufferSize = 1024, i;  
   SQLRETURN retCode;  
   SQLSMALLINT numColumn = 0, bufferLenUsed;
   
   retCode = SQLNumResultCols(hstmt, &numColumn);  
   
   SQLPOINTER* columnLabels = (SQLPOINTER *)malloc( numColumn * sizeof(SQLPOINTER*) );  
   struct DataBinding* columnData = (struct DataBinding*)malloc( numColumn * sizeof(struct DataBinding) );  
  
   printf( "Columns from that table:\n" );  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnLabels[i] = (SQLPOINTER)malloc( bufferSize*sizeof(char) );  
  
      retCode = SQLColAttribute(hstmt, (SQLUSMALLINT)i + 1, SQL_DESC_LABEL, columnLabels[i], (SQLSMALLINT)bufferSize, &bufferLenUsed, NULL);  
      wprintf( L"Column %d: %s\n", i, (wchar_t*)columnLabels[i] );  
   }  
  
   // allocate memory for the binding  
   for ( i = 0 ; i < numColumn ; i++ ) {  
      columnData[i].TargetType = SQL_C_CHAR;  
      columnData[i].BufferLength = (bufferSize+1);  
      columnData[i].TargetValuePtr = malloc( sizeof(unsigned char)*columnData[i].BufferLength );  
   }  
  
   // setup the binding   
   for ( i = 0 ; i < numColumn ; i++ ) {  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, columnData[i].TargetType,   
         columnData[i].TargetValuePtr, columnData[i].BufferLength, &(columnData[i].StrLen_or_Ind));  
   }  
  
   printf( "Data from that table:\n" );  
   // fetch the data and print out the data  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt) ) {  
      int j;  
      for ( j = 0 ; j < numColumn ; j++ )  
         wprintf( L"%s: %hs\n", columnLabels[j], columnData[j].TargetValuePtr );  
      printf( "\n" );  
   }  
   printf( "\n" );   
}  
  
int main() {  
   int bufferSize = 1024, i, count = 1, numCols = 5;  
   wchar_t firstTableName[1024], * dbName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize ), * userName = (wchar_t *)malloc( sizeof(wchar_t)*bufferSize );  
   HWND desktopHandle = GetDesktopWindow();   // desktop's window handle  
   SQLWCHAR connStrbuffer[1024];  
   SQLSMALLINT connStrBufferLen, bufferLen;  
   SQLRETURN retCode;  
  
   SQLHENV henv = NULL;   // Environment     
   SQLHDBC hdbc = NULL;   // Connection handle  
   SQLHSTMT hstmt = NULL;   // Statement handle  
  
   struct DataBinding* catalogResult = (struct DataBinding*) malloc( numCols * sizeof(struct DataBinding) );  
   SQLWCHAR* selectAllQuery = (SQLWCHAR *)malloc( sizeof(SQLWCHAR) * bufferSize );  
  
   // connect to database  
   retCode = SQLAllocHandle(SQL_HANDLE_ENV, SQL_NULL_HANDLE, &henv);  
   retCode = SQLSetEnvAttr(henv, SQL_ATTR_ODBC_VERSION, (SQLCHAR *)(void*)SQL_OV_ODBC3, -1);  
   retCode = SQLAllocHandle(SQL_HANDLE_DBC, henv, &hdbc);  
   retCode = SQLSetConnectAttr(hdbc, SQL_LOGIN_TIMEOUT, (SQLPOINTER)10, 0);  
   retCode = SQLDriverConnect(hdbc, desktopHandle, L"Driver={SQL Server}", SQL_NTS, connStrbuffer, 1025, &connStrBufferLen, SQL_DRIVER_PROMPT);  
   retCode = SQLAllocHandle(SQL_HANDLE_STMT, hdbc, &hstmt);  
  
   // display the database information  
   retCode = SQLGetInfo(hdbc, SQL_DATABASE_NAME, dbName, (SQLSMALLINT)bufferSize, (SQLSMALLINT *)&bufferLen);  
   retCode = SQLGetInfo(hdbc, SQL_USER_NAME, userName, (SQLSMALLINT)bufferSize, &bufferLen);  
  
   for ( i = 0 ; i < numCols ; i++ ) {  
      catalogResult[i].TargetType = SQL_C_CHAR;  
      catalogResult[i].BufferLength = (bufferSize + 1);  
      catalogResult[i].TargetValuePtr = malloc( sizeof(unsigned char)*catalogResult[i].BufferLength );  
   }  
  
   // Set up the binding. This can be used even if the statement is closed by closeStatementHandle  
   for ( i = 0 ; i < numCols ; i++ )  
      retCode = SQLBindCol(hstmt, (SQLUSMALLINT)i + 1, catalogResult[i].TargetType, catalogResult[i].TargetValuePtr, catalogResult[i].BufferLength, &(catalogResult[i].StrLen_or_Ind));  
  
   retCode = SQLTables( hstmt, (SQLWCHAR*)SQL_ALL_CATALOGS, SQL_NTS, L"", SQL_NTS, L"", SQL_NTS, L"", SQL_NTS );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   retCode = SQLTables( hstmt, dbName, SQL_NTS, userName, SQL_NTS, L"%", SQL_NTS, L"TABLE", SQL_NTS );  
  
   for ( retCode = SQLFetch(hstmt) ; retCode == SQL_SUCCESS || retCode == SQL_SUCCESS_WITH_INFO ; retCode = SQLFetch(hstmt), ++count )  
      if ( count == 1 )  
         StringCchPrintfW( firstTableName, 1024, L"%hs", catalogResult[2].TargetValuePtr );  
   retCode = SQLFreeStmt(hstmt, SQL_CLOSE);  
  
   wprintf( L"Select all data from the first table (%s)\n", firstTableName );  
   StringCchPrintfW( selectAllQuery, bufferSize, L"SELECT * FROM %s", firstTableName );  
  
   retCode = SQLExecDirect(hstmt, selectAllQuery, SQL_NTS);  
   printStatementResult(hstmt);  
}  

另請參閱

ODBC API 參考
ODBC 標頭檔
ODBC 程式範例