SqlCeCommand.SetRange-Methode
Schränkt die Menge der Zeilen ein, die vom SqlCeDataReader gelesen werden.
Namespace: System.Data.SqlServerCe
Assembly: System.Data.SqlServerCe (in System.Data.SqlServerCe.dll)
Syntax
'Declaration
Public Sub SetRange ( _
dbRangeOptions As DbRangeOptions, _
startData As Object(), _
endData As Object() _
)
'Usage
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[]
)
Parameter
- dbRangeOptions
Typ: System.Data.SqlServerCe.DbRangeOptions
Die Optionen zum Angeben des Bereichs.
- startData
Typ: array<System.Object[]
Die Schlüsselwerte für den Anfang des Bereichs.
- endData
Typ: array<System.Object[]
Die Schlüsselwerte für das Ende des Bereichs.
Ausnahmen
Ausnahme | Bedingung |
---|---|
InvalidOperationException | Die IndexName-Eigenschaft wurde nicht festgelegt. |
Hinweise
Diese Methode soll eine schnellere Alternative zu einer SELECT-Anweisung zum Abrufen einer Menge an Zeilen aus einer Basistabelle darstellen. Anstelle einer WHERE-Klausel in einer SELECT-Anweisung kann die SetRange-Methode dazu verwendet werden, eine Menge von Zeilen anhand ihrer Indexwerte schnell abzurufen. Um z. B. eine Reihe von Mitarbeitern mit einer Mitarbeiter-ID zwischen 1 und 5 abzurufen, könnten Sie eine SELECT-Anweisung ausführen. Die Leistung wird jedoch erheblich gesteigert, wenn Sie einen Bereich von 1 bis 5 für den Mitarbeiter-ID-Index festlegen.
Diese Methode kann nur verwendet werden, wenn die CommandType-Eigenschaft auf TableDirect, die CommandText-Eigenschaft auf einen gültigen Basistabellennamen und die IndexName-Eigenschaft auf einen gültigen Indexnamen in der angegebenen Basistabelle festgelegt wird. Wenn SetRange verwendet wird, gibt die von der ExecuteReader-Methode zurückgegebene SqlCeDataReader-Klasse nur die Zeilen zurück, deren Schlüsselwerte im angegebenen Index mit dem Bereich übereinstimmen.
Wenn die Seek-Methode für eine SqlCeDataReader-Klasse verwendet wird, die über einen Bereich verfügt, wird die Seek-Methode nur in Zeilen im angegebenen Bereich positioniert. Ausführliche Informationen zur SetRange-Methode finden Sie unter dem Thema "IRowsetIndex::SetRange" in der OLE DB-Dokumentation.
Beispiele
In diesem Beispiel werden Daten unter Verwendung eines Indexes in eine SqlCeDataReader-Klasse von der Tabelle "Orders" abgerufen. Der Bereich im Index, für den die Seek-Methode von der SetRange-Methode angegeben wird.
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);
}