共用方式為


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 定義的欄位,而 *CharacterAttributePtr 是整數,則會忽略此字段。 如果 *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 HandleHandleType 來取得相關聯的 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 上呼叫 SQLCancelSQLCancelHandle。 然後在 StatementHandle再次呼叫函式。

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

(DM) 已針對 StatementHandle 呼叫 SQLExecuteSQLExecDirectSQLMoreResults,並傳回SQL_PARAM_DATA_AVAILABLE。 在擷取所有數據流參數的數據之前,會呼叫此函式。

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

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

(DM) 已針對 StatementHandle 呼叫 SQLExecuteSQLExecDirectSQLBulkOperationsSQLSetPos,並傳回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 可以傳回 SQLPrepareSQLExecute 可傳回的任何 SQLSTATE,視數據源評估與 StatementHandle 相關聯的 SQL 語句而定。

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

註解

如需應用程式如何使用 SQLColAttribute 傳回的資訊,請參閱結果集元數據

SQLColAttribute 會傳回 *NumericAttributePtr 或 *CharacterAttributePtr 中的資訊。 整數資訊會在 *NumericAttributePtr 中傳回為 SQLLEN 值;所有其他資訊格式都會以 *CharacterAttributePtr 傳回。 當 *NumericAttributePtr 中傳回資訊時,驅動程式會 忽略 CharacterAttributePtrBufferLengthStringLengthPtr。 當 *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 值。xFieldIdentifierODBC 3 的 #define 值相同。xFieldIdentifier,函數調用中的值只會通過。

  • ODBC 2 的 #define 值。x FieldIdentifiers SQL_COLUMN_LENGTH、SQL_COLUMN_PRECISION和SQL_COLUMN_SCALE與 ODBC 3 的 #define 值不同xFieldIdentifiers 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 值。xFieldIdentifierODBC 3 的 #define 值不同。xFieldIdentifier,如同 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 程式範例