Important
此功能将在将来的 Windows 版本中删除。 避免在新开发工作中使用此功能,并计划修改当前使用此功能的应用程序。 Microsoft建议使用驱动程序的游标功能。
为了支持定位更新和删除语句,光标库从定位语句构建一个搜索或UPDATEDELETE语句。 为了支持在数据块中调用 SQLGetData ,光标库会构造一个搜索的 SELECT 语句,创建包含当前数据行的结果集。 在这些语句中, WHERE 子句枚举了缓存中每个返回 SQL_DESC_SEARCHABLE 字段标识符 SQL_PRED_SEARCHABLE 或 SQL_PRED_BASIC 的绑定列的缓存值。
注意
光标库构建的 WHERE 子句用于识别当前行,可能无法识别任何行、识别不同行或识别多行。
如果定位的更新或删除语句影响多行,光标库只更新光标所在行的状态数组,返回SQL_SUCCESS_WITH_INFO和SQLSTATE 01001(光标操作冲突)。 如果语句未识别任何行,光标库不会更新行状态数组,返回SQL_SUCCESS_WITH_INFO和SQLSTATE 01001(光标操作冲突)。 应用程序可以调用 SQLRowCount 来确定被更新或删除的行数。
如果用于定位光标以调用 SQLGetData 的 SELECT 子句识别了多行,SQLGetData 不保证返回正确的数据。 如果没有识别任何行, SQLGetData 返回SQL_NO_DATA。
如果应用程序符合以下指南,光标库构建的 WHERE 子句应能唯一标识当前行,除非不可行,例如数据源包含重复行。
绑定唯一标识该行的列。 如果绑定列无法唯一标识该行,光标库构建的 WHERE 子句可能会识别多行。 在定位式更新或删除语句中,这样的子句可能导致多行被更新或删除。 在调用 SQLGetData 时,这样的子句可能导致驱动返回错误的行数据。 将所有列绑定为唯一键,保证每一行的唯一标识。
分配足够大的数据缓冲区,以避免截断。 光标库的缓存是行集缓冲区中用 SQLBindCol 绑定的结果集缓冲区中值的副本。 如果数据在这些缓冲区中被截断,缓存中也会被截断。 由截断值构成的 WHERE 子句可能无法正确识别数据源中的底层行。
为二进制C数据指定非空长度缓冲区。 光标库只有在 SQLBindCol 中的 StrLen_or_IndPtr 参数非空时,才会在缓存中分配长度缓冲区。 当SQL_C_BINARY TargetType 参数时,光标库需要二进制数据的长度,才能从数据中构造 WHERE 子句。 如果SQL_C_BINARY列没有长度缓冲区,且应用程序调用 SQLGetData 或尝试执行定位的更新或删除语句,光标库返回SQL_ERROR和SQLSTATE SL014(已发出定位请求且并非所有列计数字段都缓冲)。
为可空列指定非空长缓冲区。 光标库只有在 SQLBindCol 中的 StrLen_or_IndPtr 参数非空时,才会在缓存中分配长度缓冲区。 由于SQL_NULL_DATA存储在长度缓冲区中,光标库假设任何未指定长度缓冲区的列都是不可空的。 如果无为可空列指定长度列,光标库会构建一个 WHERE 子句,使用该列的数据值。 该条款无法正确识别行。