Compartilhar via


Método SqlCeCommand.SetRange

Restringe o conjunto de linhas que será lido pelo SqlCeDataReader.

Namespace:  System.Data.SqlServerCe
Assembly:  System.Data.SqlServerCe (em System.Data.SqlServerCe.dll)

Sintaxe

'Declaração
Public Sub SetRange ( _
    dbRangeOptions As DbRangeOptions, _
    startData As Object(), _
    endData As Object() _
)
'Uso
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[]
)

Parâmetros

  • startData
    Tipo: array<System.Object[]
    Os valores de chave iniciais para o intervalo.
  • endData
    Tipo: array<System.Object[]
    Os valores de chave finais para o intervalo.

Exceções

Exceção Condição
InvalidOperationException

A propriedade IndexName não foi definida.

Comentários

Pretende-se que este método seja uma alternativa mais rápida a uma instrução SELECT para recuperar um conjunto de linhas de uma tabela base. Em vez de uma cláusula WHERE em uma instrução SELECT, SetRange pode ser usado para recuperar rapidamente um conjunto de linhas com base em seus valores de índice. Por exemplo, para recuperar um conjunto de funcionários com identificações entre 1 e 5, você poderia executar uma instrução SELECT, mas a definição de um intervalo de 1 a 5 no índice das identificações de funcionários melhorará bastante o desempenho.

Este método pode ser usado somente quando CommandType estiver definido como TableDirect, CommandText estiver definido com um nome de tabela base válido e IndexName estiver definido com um nome de índice válido na tabela base especificada. Quando SetRange for usado, o SqlCeDataReader retornado de ExecuteReader retornará apenas as linhas cujos valores principais no índice especificado corresponderem ao intervalo.

Quando Seek for usado em um SqlCeDataReader que possui um intervalo, Seek se posicionará apenas nas linhas do intervalo especificado. Para obter informações detalhadas sobre SetRange, consulte o tópico "IRowsetIndex::SetRange" na documentação do OLE DB.

Exemplos

Este exemplo recupera dados da tabela Orders usando um índice em um SqlCeDataReader. O intervalo no índice no qual Seek é especificado pelo método 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);
        }

Consulte também

Referência

SqlCeCommand Classe

Namespace System.Data.SqlServerCe