游标类型¶
在ODBC驱动标准层面约定了四种游标类型:静态游标、Keyset键集游标、动态游标、只进游标。可以通过SQLSetStmtAttr方法设置语句句柄的SQL_ATTR_CURSOR_TYPE属性,属性值分别为:
- SQL_CURSOR_STATIC (静态游标)
- SQL_CURSOR_KEYSET_DRIVEN(键集游标)
- SQL_CURSOR_DYNAMIC(动态游标)
- SQL_CURSOR_FORWARD_ONLY (只进游标)
- SQL_CURSOR_TYPE_DEFAULT(默认值:指向SQL_CURSOR_FORWARD_ONLY)
设置游标类型的方式:
SQLSetStmtAttr(hstmt, SQL_ATTR_CURSOR_TYPE, (void*)SQL_CURSOR_STATIC, SQL_IS_UINTEGER);
静态游标(SCROLLABLE和INSENSITIVE)
游标显示的结果集静止不变。游标打开后,对结果集的改变,无论是游标自己或是其他用户的操作,都不会被游标探知; 因此静态游标是可滚动的,但是不敏感的。
神通ODBC对于静态游标的实现是不用数据库端的游标,而是一种本地游标,它将一个查询语句直接在数据库中执行, 数据库会一次性返回所有结果,ODBC驱动会缓存所有这些结果;因此静态游标使用时需要注意,如果一个查询结果非常大, 可能导致获取第一条数据的结果耗时长,且客户端内存占用很大。
键集游标(SCROLLABLE和SENSITIVE)
键集游标的概念为查询时,会先将查询结果中的所有唯一能确定一行的键值字段返回给驱动,在ODBC驱动获取具体某一行数据时,会将键值作为条件形成SQL语句到数据库中查询, 因此用Key-set游标时,会为每一条数据生成一个SQL语句,数据库的日志中能看到相关SQL语句,因此可以看到,Key-set游标是可以滚动和敏感的, 但由于会为每一条数据生成一个SQL语句,导致获取数据的效率不高。
神通数据库的ODBC在执行查询语句过程中,会自动在SQL语句中添加ROWID和SYSATTR_ROWVERSION字段,因为神通数据库中任何一种表都会有这两个隐藏列, 且是唯一的,可以作为每一行数据的唯一键值。神通ODBC的键集游标也是一种本地游标。 在神通数据库 ODBC中,键集游标只能在基于单表的SQL查询中使用,否则驱动会自动的将游标类型改成静态游标。
动态游标(SCROLLABLE和SENSITIVE)
与静态游标相反,当滚动游标时动态游标反映结果集中的所有更改。结果集中的行数据值、顺序和成员每次提取时都会改变。
神通ODBC的动态游标是利用数据库的游标实现的,因此让是一种服务器端游标。 执行语句时只是用Declae cursor语句在数据库端创建一个游标,ODBC接口在获取数据时,ODBC才会发Fetch语句从游标中获取数据返回给ODBC端, 由于Fetch语句可以一次性获取多条数据,因此获取的数据会缓存在ODBC客户端里,应用程序将缓存的数据读取完成后,ODBC会再次发送Fetch语句从数据库获取下一批数据。
神通ODBC数据源中可以设置FetchSize参数来设置游标每次从数据库服务器端获取的数据行数;FetchSize参数也可以在连接字符串中设置。
注意
Declae cursor语句、Fetch语句可参考数据库SQL语法中的描述。
只进游标(NON-SCROLLABLE和SENSITIVE)
只进游标其实是动态游标中的一种,也是一种服务器端游标,因为动态游标是可以滚动的,如果设置动态游标未不可滚动,则为只进游标。