本主题描述如何使用 SqlCeDataReader 进行查找。
在索引上查找
通过使用 SqlCeDataReader 对象的 Seek 方法,可以在结果集(或游标)中快速发现行。在进行查找时,您可以同时指定要进行查找的索引的范围和选择行的方式。若要进行查找,必须在 SqlCeCommand 对象上指定 IndexName 属性。
设置索引范围
SqlCeCommand 对象的 SetRange 方法指定要进行查找的索引范围。通常使用索引开始和结束值以及范围选项来指定范围。这些是由 DbRangeOptions 枚举指定的。如果没有指定任何范围选项,默认情况下,范围会包括开始和结束值。如果设置了 DbRangeOptions.Match 的范围选项,该范围将只包括其索引值匹配 startData 值的所有行。如果设置了 DbRangeOptions.Prefix 的范围选项,该范围将包括其索引值以 startData 值开始的所有行。当使用 Match 或 Prefix 时,结束值必须设置为 NULL。有关详细信息,请参阅 .NET Framework 类库参考中的“DbRangeOptions Enumeration”主题。
查找选项
查找选项指定如何选择索引上的行。诸如 FirstEqual、LastEqual、BeforeEqual 和 AfterEqual 的选项,其名称中都包含 Equal,这些选项选择匹配查找值的行。如果没有与查找值匹配的索引行,则会选择之前(如果 FirstEqual 和 BeforeEqual)或之后(如果 AfterEqual 和 LastEqual)的行。有关详细信息,请参阅 .NET Framework 类库参考中的“DbSeekOptions Enumeration”主题。
示例
下面的示例说明在三列索引上执行的 Seek 方法,列上的数据类型是 integer、datetime 和 money。integer 索引的索引范围从 1 到 5(含)。datetime 和 money 列的索引范围分别开始于 1/1/1996 和 $10.00。该示例选择 integer 列为 1、datetime 列为 1/1/1997 以及 money 列为 $10.50 的行。如果不存在匹配该条件的索引,AfterEqual 属性将会选择该索引的下一行。
备注
下面的代码使用 TableDirect 命令类型。在将 TableDirect 用于 SQL Server Compact 3.5 时,无法联接表。
// Example that seeks on a three-column index
public void CreateMySqlCeCommand(SqlCeConnection conn)
{
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.TableDirect;
// This is the name of the base table.
cmd.CommandText = "Orders";
//Assume: Index contains three columns [int, datetime, money]
cmd.IndexName = "SomeIndex";
object[] start = new object[3];
object[] end = new object[1];
start[0] = 1;
start[1] = new SqlDateTime(1996, 1, 1);
start[2] = new SqlMoney(10.00);
end[0] = 5;
cmd.SetRange(DbRangeOptions.InclusiveStart |
DbRangeOptions.InclusiveEnd, start, end);
SqlCeDataReader rdr = cmd.ExecuteReader();
rdr.Seek(DbSeekOptions.AfterEqual, 1, new SqlDateTime(1997, 1,1),
new SqlMoney(10.50));
while(rdr.Read())
{
// Read data in the usual way.
}
rdr.Close();
}