游标的类型
Microsoft SQL Server 2005 Compact Edition (SQL Server Compact Edition) 游标与 SQL Server 中使用的游标类似。本节介绍它们之间的差异。有关数据库游标的完整解释,请参阅 SQL Server 联机丛书。
SQL Server Compact Edition 支持下列游标类型:
- 基表
- 静态
- 只进
- 只进/只读
- 键集驱动
基表游标
基表游标是可用的最低级别的游标。这些游标直接在存储引擎上工作,是所有支持的游标类型中速度最快的游标。基表游标可以最低开销向前或向后滚动,并且可以更新。
您还可以直接在索引上打开游标。此类游标支持索引,以便对表中的行进行排序、允许查找特定值以及基于索引中的值的范围对行进行限制。
基表游标具有动态成员身份。这意味着,在同一个表上打开的两个游标可以立即看见对数据的插入、删除和更改(假定它们两个都在同一事务作用范围内)。由于可以更新基表游标,因此客户端可以使用此类游标来更改基本数据。
基表游标无法表示查询结果。查询结果(例如 SELECT * FROM tablename
)无法通过基表游标返回。而是使用支持的查询结果游标返回结果。
下面的示例说明如何使用 ADO .NET 获取基表游标:
//Base Table Cursor
cmd.CommandText = "tablename";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
下面的示例说明如何使用 ADO .NET 获取索引游标:
cmd.CommandText = "tablename";
cmd.IndexName = "indexname";
cmd.CommandType = CommandType.TableDirect;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
静态游标
静态游标(在以前的 SQL Server Compact Edition 版本中称为可滚动查询游标)可以创建和存储结果集的完整副本。当用户显式请求检索的长整型值数据时例外。只有在需要时才填充此结果集。这与 SQL Server 不同,后者在创建游标时就会填充结果集。静态游标支持向后滚动和向前滚动,但不支持更新。静态游标无法看见外部对不敏感的数据所做的更改。在游标的生存周期内将缓存查询结果。尽管静态游标比只进游标功能更强,但静态游标速度较慢,并且会使用更多的内存。建议只有在需要滚动并且键集游标不合适时再考虑使用静态游标。
下面的示例说明如何使用 ADO.NET 获取静态游标:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Insensitive);
只进游标
只进游标是可更新的速度最快的游标,但不支持滚动。它只支持从游标头至游标尾顺序提取行。在提取行之前,无法从数据库中检索这些行。从游标提取行时,由当前用户创建或由其他用户提交并会影响结果集中的行的所有 INSERT、UPDATE 和 DELETE 语句的效果均可见。由于游标无法向后滚动,因此在行被提取之后,将无法通过使用游标看见在数据库中对行所做的更改。
只进游标和只进/只读游标是基于查询的速度最快的游标。它们应当用在优先考虑速度和内存占用量的方案中。
下面的示例说明如何使用 ADO .NET 获取只进游标:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Updatable);
只进/只读游标
只进/只读游标(在以前的 SQL Server Compact Edition 版本中称为只进游标)是最快的游标,但无法进行更新。
下面的示例说明如何使用 ADO.NET 获取只进/只读游标:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.None);
注意 不能在只返回只读列的查询上创建只读游标,因为内部的所有 SQL Server Compact Edition 游标都是可更新的。SQL Server Compact Edition 无法更新在 SqlCeResultSet 中返回的只读列。因此,它将失败,并返回错误“由于不存在可更新列,因此无法生成用于查询的可更新游标”。
键集驱动游标
SQL Server Compact Edition 中的键集驱动游标是可以进行更新的可滚动游标。键集驱动游标由一组称为键集的物理标识符来控制。键集基于在打开游标时对 SELECT 语句验证合格的所有行。在打开游标时将在临时表中生成键集。使用键集驱动游标,将在执行查询时确定成员身份。
SQL Server Compact Edition 中的键集驱动游标与 SQL Server 中的键集驱动游标有细微的差别。在 SQL Server 中,键集驱动游标使用一组唯一标识符作为键集中的键。在 SQL Server Compact Edition 中,键是表示值在表中的逻辑存储位置的书签。它们不是唯一标识符。
尽管对许多更改敏感,但键集驱动游标不如其他游标敏感。例如,尽管在游标内的插入将在结束时可以看见,但无法看见在游标外的插入。在这种情况下,建议您关闭并重新打开游标,或使用一个只进游标。
由于 SQL Server Compact Edition 使用书签来定义键集,因此通过使用游标,对键集中所包括行的数据值所做的所有更改都是可见的。对于在游标内所做的更改和在游标外所做的更改,情况都是这样的。
无论是在游标内还是在游标外,在键集游标中所做的任何删除操作都将导致在试图提取行时报告该行已被删除。
下面的示例说明如何使用 ADO .NET 获取键集驱动游标:
cmd.CommandText = "Select * from tablename";
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
使用联接
如果用来打开键集驱动游标的查询包含联接的列,则这些列不可更新。用户可以向这些列中插入新值,但不支持更新。
如果键集被用来填充用户可更新的控件(如 DataGrid 对象),则用户可能会试图更新控件中的值,此时更新将失败。如果要开发的应用程序将使用 DataGrid 来显示联接的列数据,请确保在 DataGrid 中将联接的列设置为只读。
请参阅
概念
游标 (SQL Server Compact Edition)
选择游标类型
游标和锁定
隐式游标转换
更新键集驱动的游标