使用 SQLBulkOperations 按书签更新行

按书签更新行时,SQLBulkOperations 会使数据源更新表中的一行或多行。 行由绑定书签列中的书签标识。 使用每个绑定列的应用程序缓冲区中的数据更新行(除非列的长度/指示器缓冲区中的值为 SQL_COLUMN_IGNORE)。 未绑定的列不会更新。

若要使用 SQLBulkOperations 按书签更新行,应用程序会:

  1. 检索和缓存要更新的所有行的书签。 如果有多个书签,并且按列绑定,则书签存储在数组中;如果有多个书签,并且按行绑定,则书签存储在行结构数组中。

  2. 将 SQL_ATTR_ROW_ARRAY_SIZE 语句属性设置为书签的数量,并将包含书签值的缓冲区或书签数组绑定到第 0 列。

  3. 将新的数据值放在行集缓冲区中。 有关如何使用 SQLBulkOperations 发送长数据的信息,请参阅长数据以及 SQLSetPos 和 SQLBulkOperations

  4. 根据需要设置每个列的长度/指示器缓冲区中的值。 这是绑定到字符串缓冲区的列数据或 SQL_NTS 的字节长度,绑定到二进制缓冲区的列数据的字节长度,以及要设置为 NULL 的任何列的 SQL_NULL_DATA。

  5. 将不更新的列的长度/指示器缓冲区中的值设置为 SQL_COLUMN_IGNORE。 尽管应用程序可以跳过此步骤并重新发送现有数据,但这样做效率低下,并且有可能将值发送到读取时被截断的数据源。

  6. 调用 SQLBulkOperations,并将 Operation 参数设置为 SQL_UPDATE_BY_BOOKMARK。

对于作为更新发送到数据源的每一行,应用程序缓冲区都应具有有效的行数据。 如果通过提取来填充应用程序缓冲区,如果维持了行状态数组,且行的状态值为 SQL_ROW_DELETED、SQL_ROW_ERROR 或 SQL_ROW_NOROW,则可能会无意中将无效数据发送到数据源。