基于行集的定位与操作¶
如果应用程序选择在结果集上使用块游标,那么在调用SQLFetch或SQLFetchScroll移动行集之后,可以进一步调用SQLSetPos对行集中的指定行进行操作。 此时,应用程序可以通过SQLSetPos在行集中已经提取的行上进行操作;特别的,在进行UPDATE或DELETE时,ODBC驱动会自行根据结果集生成并执行相应的UPDATE或DELETE语句:
SQL_POSITION:定位游标在行集的指定行上。
SQL_REFRESH:刷新行集的指定行;如果结果集的某些列已经被绑定,那么ODBC驱动会用取得的值重新填充绑定的应用程序变量。
SQL_UPDATE:更新行集的指定行;更新的数据从结果集绑定列的应用程序变量取得。
SQL_DELETE:删除行集的指定行。
需要指出,神通数据库 ODBC驱动中使用SQLSetPos的SQL_UPDATE或SQL_DELETE,那么语句句柄上使用的游标必须是可写的, 而在本章的游标属性一节提到除键集游标外,游标的并发特性都只能设置为只读;因此要使用这两项操作,应用程序必须选择游标类型为键集游标,并选择游标的并发特性为行版本。
调用SQLSetPos时,应用程序必须指定RowNumber参数指定操作的行。 行集中的行集编号从1开始,行号的最大值就是行集的大小; 行集编号0有特殊的意义,当指定RowNumber为0时,SQLSetPos的操作会在行集所有的行上进行。 应用程序可以调用SQLSetStmtAttr来设置行集大小,但新的设置必须在下一次调用SQLFetch或SQLFetchScroll后才会生效。
在调用SQLSetPos删除一行后,这一行并不会立即消失,游标仍然定位在这一行上。 但同时,这一行的状态会被标志为SQL_ROW_DELETED,因此在该行上不能再次调用SQLSetPos或用SQLGetData获取数据。