SqlCeCommand.SetRange メソッド

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

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

構文

'宣言
Public Sub SetRange ( _
    dbRangeOptions As DbRangeOptions, _
    startData As Object(), _
    endData As Object() _
)
'使用
Dim instance As SqlCeCommand
Dim dbRangeOptions As DbRangeOptions
Dim startData As Object()
Dim endData As Object()

instance.SetRange(dbRangeOptions, startData, _
    endData)
public void SetRange(
    DbRangeOptions dbRangeOptions,
    Object[] startData,
    Object[] endData
)
public:
void SetRange(
    DbRangeOptions dbRangeOptions, 
    array<Object^>^ startData, 
    array<Object^>^ endData
)
member SetRange : 
        dbRangeOptions:DbRangeOptions * 
        startData:Object[] * 
        endData:Object[] -> unit 
public function SetRange(
    dbRangeOptions : DbRangeOptions, 
    startData : Object[], 
    endData : Object[]
)

パラメーター

  • startData
    型: array<System.Object[]
    範囲の開始を示すキー値。
  • endData
    型: array<System.Object[]
    範囲の終了を示すキー値。

例外

例外 条件
InvalidOperationException

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

説明

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

このメソッドを使用するためには、CommandType を TableDirect に、有効なベース テーブル名を 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);
        }

関連項目

参照

SqlCeCommand クラス

System.Data.SqlServerCe 名前空間