Seek メソッド
SqlCeDataReader を、指定したパラメータに一致するインデックス値が存在するレコードに配置します。
名前空間: System.Data.SqlServerCe
アセンブリ: System.Data.SqlServerCe (System.Data.SqlServerCe.dll)
構文
'宣言
Public Function Seek ( _
dbSeekOptions As DbSeekOptions, _
ParamArray index As Object() _
) As Boolean
'使用
Dim instance As SqlCeDataReader
Dim dbSeekOptions As DbSeekOptions
Dim index As Object()
Dim returnValue As Boolean
returnValue = instance.Seek(dbSeekOptions, _
index)
public bool Seek(
DbSeekOptions dbSeekOptions,
params Object[] index
)
public:
bool Seek(
DbSeekOptions dbSeekOptions,
... array<Object^>^ index
)
member Seek :
dbSeekOptions:DbSeekOptions *
index:Object[] -> bool
public function Seek(
dbSeekOptions : DbSeekOptions,
... index : Object[]
) : boolean
パラメーター
- dbSeekOptions
型: System.Data.SqlServerCe. . :: . .DbSeekOptions
使用する DbSeekOptions。
- index
型: array<System. . :: . .Object> [] () [] []
レコードのインデックス。
戻り値
型: System. . :: . .Boolean
ブール値。true の場合はカーソルが行に配置されています。
例外
例外 | 条件 |
---|---|
SqlCeException | 値が見つからないか、他のエラーが発生しました。 |
説明
このメソッドは、SELECT ステートメントの代わりに使用して、ベース テーブルから行をより速く取得することを目的としています。SELECT ステートメントの WHERE 句の代わりに Seek を使用して、インデックス値に基づいて、行をすばやく取得できます。たとえば、従業員 ID が 5 の従業員を取得する場合は、SELECT ステートメントを実行することもできますが、従業員 ID インデックスの値に 5 を指定して Seek を使用すると、パフォーマンスが大幅に向上します。
Seek を使用するためには、CommandType を TableDirect にし、有効なテーブル名を CommandText に設定し、指定したベース テーブルの有効なインデックス名を IndexName に設定する必要があります。
Seek の使用後、SqlCeDataReader は、残りの値をインデックス順に返します。SetRange で範囲が指定された SqlCeDataReader で Seek を使用する場合、Seek は、指定した範囲内の行だけを対象とします。詳細については、OLE DB のドキュメントの「IRowsetIndex::Seek」を参照してください。
使用例
Try
Dim conn As New SqlCeConnection("Data Source = MyDatabase.sdf")
conn.Open()
Dim cmd As SqlCeCommand = conn.CreateCommand()
cmd.CommandType = CommandType.TableDirect
cmd.IndexName = "Orders_PK"
cmd.CommandText = "Orders"
' We are interested in orders that match Order ID = 10020
'
cmd.SetRange(DbRangeOptions.Match, New Object() {10020}, Nothing)
Dim reader As SqlCeDataReader = cmd.ExecuteReader(CommandBehavior.Default)
While reader.Read()
MessageBox.Show(String.Format("{0} ; {1}", reader("Order ID"), reader("Order Date")))
End While
' Now we are interested in orders with Order ID between (10020, 10050)
'
cmd.SetRange(DbRangeOptions.InclusiveStart Or DbRangeOptions.InclusiveEnd, New Object() {10020}, New Object() {10050})
reader = cmd.ExecuteReader(CommandBehavior.Default)
' Now seek to Order ID = 10045
'
Dim onRow As Boolean = reader.Seek(DbSeekOptions.FirstEqual, New Object() {10045})
' Now ,the reader will return rows with Order ID >= 10045 <= 10050
' because the range was set to (10020, 10050)
'
If onRow Then
While reader.Read()
MessageBox.Show(String.Format("{0} ; {1}", reader("Order ID"), reader("Order Date")))
End While
End If
Catch e As Exception
MessageBox.Show(e.Message)
End Try
try
{
SqlCeConnection conn = new SqlCeConnection("Data Source = MyDatabase.sdf");
conn.Open();
SqlCeCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.TableDirect;
cmd.IndexName = "Orders_PK";
cmd.CommandText = "Orders";
// We are interested in orders that match Order ID = 10020
//
cmd.SetRange(DbRangeOptions.Match, new object[] { 10020 }, null);
SqlCeDataReader reader = cmd.ExecuteReader(CommandBehavior.Default);
for (int i = 1; reader.Read(); i++)
{
MessageBox.Show(String.Format("{0} ; {1}", reader["Order ID"], reader["Order Date"]));
}
// Now we are interested in orders with Order ID between (10020, 10050)
//
cmd.SetRange(DbRangeOptions.InclusiveStart | DbRangeOptions.InclusiveEnd,
new object[] { 10020 }, new object[] { 10050 });
reader = cmd.ExecuteReader(CommandBehavior.Default);
// Now seek to Order ID = 10045
//
bool onRow = reader.Seek(DbSeekOptions.FirstEqual, new object[] { 10045 });
// Now ,the reader will return rows with Order ID >= 10045 <= 10050
// because the range was set to (10020, 10050)
//
if (onRow)
{
for (int i = 1; reader.Read(); i++)
{
MessageBox.Show(String.Format("{0} ; {1}", reader["Order ID"], reader["Order Date"]));
}
}
}
catch (Exception e)
{
MessageBox.Show(e.Message);
}