构造搜索语句

重要

Windows 的未来版本中将移除此功能。 避免在新的开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 Microsoft 建议使用驱动程序的游标功能。

为了支持定位更新和删除语句,游标库从定位语句构造搜索的 UPDATEDELETE 语句。 为了支持在数据块中调用 SQLGetData ,游标库构造搜索的 SELECT 语句以创建包含当前数据行的结果集。 在上述每个语句中, WHERE 子句枚举每个绑定列的缓存中存储的值,这些值返回 SQLColAttribute 中SQL_DESC_SEARCHABLE字段标识符的SQL_PRED_SEARCHABLE或SQL_PRED_BASIC。

注意

游标库构造的用于标识当前行的 WHERE 子句可能无法识别任何行、无法标识不同的行或标识多个行。

如果定位更新或删除语句影响多行,则游标库仅更新定位游标所在的行的行状态数组,并返回SQL_SUCCESS_WITH_INFO和 SQLSTATE 01001 (游标操作冲突) 。 如果 语句未标识任何行,则游标库不会更新行状态数组,并返回SQL_SUCCESS_WITH_INFO和 SQLSTATE 01001 (Cursor 操作冲突) 。 应用程序可以调用 SQLRowCount 来确定已更新或删除的行数。

如果用于定位调用 SQLGetData 的游标的 SELECT 子句标识了多行,则不保证 SQLGetData 返回正确的数据。 如果它未标识任何行, SQLGetData 将返回SQL_NO_DATA。

如果应用程序符合以下准则,则游标库构造的 WHERE 子句应唯一标识当前行,除非这是不可能的,例如数据源包含重复行时。

  • 绑定唯一标识行的列。 如果绑定列不唯一标识行,则游标库构造的 WHERE 子句可能会标识多行。 在定位的 update 或删除 语句中,此类子句可能会导致更新或删除多个行。 在调用 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 子句,该子句使用该列的数据值。 此子句无法正确标识行。