SqlCeCommand.SetRange Method

SqlCeDataReader が読み込む行セットを制限します。

名前空間: System.Data.SqlServerCe
アセンブリ: System.Data.SqlServerCe (system.data.sqlserverce.dll 内)

構文

'宣言
Public Sub SetRange ( _
    dbRangeOptions As DbRangeOptions, _
    startData As Object(), _
    endData As Object() _
)
public void SetRange (
    DbRangeOptions dbRangeOptions,
    Object[] startData,
    Object[] endData
)
public:
void SetRange (
    DbRangeOptions dbRangeOptions, 
    array<Object^>^ startData, 
    array<Object^>^ endData
)
public void SetRange (
    DbRangeOptions dbRangeOptions, 
    Object[] startData, 
    Object[] endData
)
public function SetRange (
    dbRangeOptions : DbRangeOptions, 
    startData : Object[], 
    endData : Object[]
)

パラメータ

  • dbRangeOptions
    範囲を指定するときに使用するオプション。
  • startData
    範囲の開始を示すキー値。
  • endData
    範囲の終了を示すキー値。

例外

例外の種類 条件
InvalidOperationException

IndexName プロパティが設定されていません。

解説

このメソッドは、SELECT ステートメントの代わりに使用して、ベース テーブルから行セットをより速く取得することを目的としています。SELECT ステートメントの WHERE 句の代わりに SetRange を使用して、インデックス値に基づいて行セットをすばやく取得できます。たとえば、従業員 ID が 1 から 5 までの従業員を取得する場合、SELECT ステートメントを実行することもできますが、従業員 ID のインデックスに 1 から 5 までの範囲を設定すると、パフォーマンスが大幅に向上します。

このメソッドを使用するためには、CommandTypeTableDirect に、有効なベース テーブル名を CommandText に、指定したベース テーブルの有効なインデックス名を IndexName に、それぞれ設定する必要があります。SetRange を使用した場合、ExecuteReader から返される SqlCeDataReader は、指定したインデックス内のキー値が範囲に一致する行だけを返します。

範囲が指定された SqlCeDataReaderSeek を使用した場合、Seek は、指定した範囲内の行だけを対象とします。SetRange の詳細については、OLE DB のドキュメントの「IRowsetIndex::SetRange」を参照してください。

この例では、インデックスを使用して、Orders テーブルから SqlCeDataReader にデータを取得します。Seek の対象となるインデックスの範囲は、SetRange メソッドによって指定されています。

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);
}

スレッド セーフ

この型の public static (Visual Basic では Shared ) メンバはすべて、スレッド セーフです。インスタンス メンバの場合は、スレッド セーフであるとは限りません。

プラットフォーム

開発プラットフォーム

Windows Vista、Windows Mobile 5.0、Windows XP Professional with Service Pack 2 (SP2)、Windows Server 2003、Windows Mobile 2003 for Pocket PC、Windows CE 5.0
バージョン情報
.NET Framework および .NET Compact Framework
3.5 でサポート
.NET Framework
3.0 でサポート
.NET Compact Framework および .Net Framework
2.0 でサポート

参照

リファレンス

SqlCeCommand Class
SqlCeCommand Members
System.Data.SqlServerCe Namespace