建構搜尋語句
重要
Windows 的未來版本將移除此功能。 請避免在新的開發工作中使用這項功能,並規劃修改目前使用這項功能的應用程式。 Microsoft 建議使用驅動程式的資料指標功能。
為了支援定位的 update 和 delete 語句,資料指標程式庫會從定位語句建構搜尋 的 UPDATE 或 DELETE 語句。 為了支援呼叫 資料區塊中的 SQLGetData ,資料指標程式庫會建構搜尋 的 SELECT 語句,以建立包含目前資料列的結果集。 在這些語句中, WHERE 子句會列舉針對 SQLColAttribute 中傳回SQL_PRED_SEARCHABLE或SQL_PRED_BASIC SQL_DESC_SEARCHABLE欄位識別碼的每個系結資料行,儲存在快取中的 值。
警告
資料指標程式庫建構的 WHERE 子句無法識別任何資料列、識別不同的資料列,或識別多個資料列。
如果定位的更新或刪除語句影響一個以上的資料列,資料指標程式庫只會針對資料指標所在的資料列更新資料列狀態陣列,並傳回SQL_SUCCESS_WITH_INFO和 SQLSTATE 01001 (資料指標作業衝突)。 如果語句未識別任何資料列,資料指標程式庫就不會更新資料列狀態陣列,並傳回 SQL_SUCCESS_WITH_INFO 和 SQLSTATE 01001 (資料指標作業衝突)。 應用程式可以呼叫 SQLRowCount 來判斷已更新或刪除的資料列數目。
如果用來放置資料指標的 SELECT 子句來呼叫 SQLGetData 可識別多個資料列, 則不保證 SQLGetData 會傳回正確的資料。 如果未識別任何資料列, SQLGetData 會傳回SQL_NO_DATA。
如果應用程式符合下列指導方針, 資料指標程式庫所建構的 WHERE 子句應該可唯一識別目前的資料列,除非這是不可能的,例如資料來源包含重複的資料列時。
系結可唯一識別資料列的資料行。 如果系結資料行無法唯一識別資料列, 資料指標程式庫所建構的 WHERE 子句可能會識別多個資料列。 在定位的更新或刪除語句中,這類子句可能會導致一個以上的資料列更新或刪除。 在對 SQLGetData 的 呼叫中,這類子句可能會導致驅動程式傳回錯誤資料列的資料。 系結唯一索引鍵中的所有資料行,可確保每個資料列都能唯一識別。
配置夠大的資料緩衝區,不會發生截斷。 資料指標程式庫的快取是系結至 SQLBindCol 結果集之資料列集緩衝區中值的複本。 如果資料在放入這些緩衝區時遭到截斷,也會在快取中截斷資料。 從截斷值建構的 WHERE 子句可能無法正確識別資料來源中的基礎資料列。
指定二進位 C 資料的非 Null 長度緩衝區。 只有當 SQLBindCol 中的StrLen_or_IndPtr 引數為非 Null 時 ,資料指標程式庫才會在其快取中 配置長度緩衝區。 當 TargetType 引數SQL_C_BINARY時,資料指標程式庫需要二進位資料的長度,才能從資料建構 WHERE 子句。 如果SQL_C_BINARY資料行沒有長度緩衝區,且應用程式會呼叫 SQLGetData 或嘗試執行定位的更新或刪除語句,則資料指標程式庫會傳回 SQL_ERROR 和 SQLSTATE SL014 (已發出定位要求,而不會緩衝處理所有資料行計數位段)。
為可為 Null 的資料行指定非 Null 長度緩衝區。 只有當 SQLBindCol 中的StrLen_or_IndPtr 引數為非 Null 時 ,資料指標程式庫才會在其快取中 配置長度緩衝區。 因為SQL_Null_DATA儲存在長度緩衝區中,資料指標程式庫會假設任何未指定長度緩衝區的資料行都是不可為 Null 的。 如果沒有為可為 Null 的資料行指定長度資料行,資料指標程式庫會 建構使用資料行資料值的 WHERE 子句。 這個子句無法正確識別資料列。