处理定位更新和删除语句

重要

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

游标库支持定位更新和删除语句,方法是将此类语句中的 WHERE CURRENT OF 子句替换为一个 WHERE 子句,该子句枚举存储在每个绑定列的缓存中的值。 游标库将新构造的 UPDATEDELETE 语句传递给驱动程序以执行。 对于定位的更新语句,游标库随后从行集缓冲区中的值更新其缓存,并将行状态数组中的相应值设置为SQL_ROW_UPDATED。 对于定位的 delete 语句,它将行状态数组中的相应值设置为 SQL_ROW_DELETED。

注意

由游标库构造的用于标识当前行的 WHERE 子句可能无法识别任何行、无法标识其他行或标识多行。 有关详细信息,请参阅本附录后面的 构造搜索语句

定位更新和删除语句受以下限制:

  • 定位更新和删除语句只能在以下情况下使用:当 SELECT 语句生成结果集时; 当 SELECT 语句不包含联接、 UNION 子句或 GROUP BY 子句时;使用选择列表中别名或表达式的任何列未绑定到 SQLBindCol 时。

  • 如果应用程序准备定位的更新或删除语句,则必须在调用 SQLFetchSQLFetchScroll 后执行此操作。 尽管游标库将 语句提交到驱动程序进行准备,但它会在应用程序调用 SQLExecute 时关闭语句并直接执行该语句。

  • 如果驱动程序仅支持一个活动语句,则游标库将提取结果集的其余部分,然后在执行定位更新或删除语句之前从其缓存重新提取当前行集。 如果应用程序随后调用一个函数,该函数返回结果集中的元数据 (例如 SQLNumResultColsSQLDescribeCol) ,则游标库将返回错误。

  • 如果对表的列执行定位更新或删除语句,该列包含时间戳列,每次执行更新时都会自动更新该列,如果绑定时间戳列,则所有后续定位的更新或删除语句都将失败。 发生这种情况的原因是游标库创建的搜索更新或删除语句无法准确标识要更新的行。 时间戳列的搜索语句中的值与时间戳列的自动更新值不匹配。