Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für: Access 2013, Office 2013
Wenn Sie ein umfangreiches untergeordnetes Recordset-Objekt verwenden, insbesondere im Vergleich zur Größe des übergeordneten Recordset-Objekts, aber nur auf ein paar untergeordnete Kapitel zugreifen müssen, könnte die Verwendung eines parametrisierten Befehls effizienter sein.
Mit einem nicht parametrisierten Befehl werden die gesamten über- und untergeordneten Recordset-Objekte abgerufen, eine Kapitelspalte wird an das übergeordnete Elemente angefügt, und anschließend wird ein Verweis auf das zugehörige untergeordnete Kapitel für jede übergeordnete Zeile zugewiesen.
Mit einem parametrisierten Befehl wird das gesamte übergeordnete Recordset-Objekt abgerufen, aber es wird nur das Kapitel des Recordset-Objekts abgerufen, wenn auf die Kapitelspalte zugegriffen wird. Dieser Unterschied bei der Abrufstrategie kann erhebliche Leistungsvorteile bieten.
Beispielsweise können Sie Folgendes angeben:
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
Die übergeordneten und untergeordneten Tabellen haben einen gemeinsamen Spaltennamen, cust_id*.* Der untergeordnete Befehl verfügt über einen Platzhalter "?", auf den die RELATE-Klausel verweist (d. h. "... PARAMETER 0").
Hinweis
[!HINWEIS] Die PARAMETER-Klausel bezieht sich ausschließlich auf die SHAPE-Befehlssyntax. Sie ist weder dem Parameter-Objekt noch der Parameters-Auflistung von ADO zugeordnet.
Wenn der parametrisierte SHAPE-Befehl ausgeführt wird, passiert Folgendes:
Der übergeordnete Befehl wird ausgeführt und gibt ein übergeordnetes Recordset aus der Customers-Tabelle zurück.
Eine Kapitelspalte wird an das übergeordnete Recordset-Objekt angefügt.
Wenn auf die Kapitelspalte einer übergeordneten Zeile zugegriffen wird, wird der untergeordnete Befehl mit dem Wert des customer.cust_id als Wert des Parameters ausgeführt.
All rows in the data provider rowset created in step 3 are used to populate the child Recordset. In this example, that is all the rows in the Orders table in which the cust_id equals the value of customer.cust_id. Standardmäßig werden die untergeordneten Recordsets auf dem Client zwischengespeichert, bis alle Verweise auf das übergeordnete Recordset freigegeben werden. Um dieses Verhalten zu ändern, legen Sie die dynamischeRecordset-EigenschaftUntergeordnete Zeilen zwischenspeichern auf False fest.
Ein Verweis auf die abgerufenen untergeordneten Zeilen (das heißt, das Kapitel des untergeordneten Recordset-Objekts) wird in der Kapitelspalte der aktuellen Zeile des übergeordneten Recordset-Objekts eingefügt.
Die Schritte 3 bis 5 werden wiederholt, wenn auf die Kapitelspalte einer anderen Zeile zugegriffen wird.
Die dynamische Eigenschaft Cache Child Rows wird standardmäßig auf True festgelegt. Das Zwischenspeicherungsverhalten hängt von den Parameterwerten der Abfrage ab. Bei einer Abfrage mit einem einzelnen Parameter wird das untergeordnete Recordset -Objekt für einen bestimmten Parameterwert zwischen den Anforderungen für ein untergeordnetes Element mit diesem Wert zwischengespeichert. Der folgende Code veranschaulicht dies:
...
SCmd = "SHAPE {select * from customer} " & _
"APPEND({select * from orders where cust_id = ?} " & _
"RELATE cust_id TO PARAMETER 0) AS chpCustOrder"
Rst1.Open sCmd, Cnn1
Set RstChild = Rst1("chpCustOrder").Value
Rst1.MoveNext ' Next cust_id passed to Param 0, & new rs fetched
' into RstChild.
Rst1.MovePrevious ' RstChild now holds cached rs, saving round trip.
...
Bei einer Abfrage mit mehreren Parametern wird nur ein zwischengespeichertes untergeordnetes Element verwendet, wenn alle Parameterwerte den zwischengespeicherten Werten entsprechen.
Parametrisierte Befehle und komplexe übergeordnete untergeordnete Beziehungen
In addition to using parameterized commands to improve performance of an equi-join type hierarchy, parameterized commands can be used to support more complex parent-child relationships. For example, consider a Little League database with two tables: one consisting of the teams (team_id, team_name) and the other of games (date, home_team, visiting_team).
Mit einer nicht parametrisierten Hierarchie können die Teams- und Spieletabellen nicht so miteinander verknüpft werden, dass das untergeordnete Recordset -Objekt für jedes Team den vollständigen Spielplan enthält. Sie können Kapitel erstellen, die den Heimspielplan oder den Auswärtsspielplan enthalten, jedoch nicht beides. Denn die RELATE-Klausel beschränkt Sie auf Beziehungen zwischen über- und untergeordneten Elementen im Format (pc1=cc1) AND (pc2=pc2). Wenn also der Befehl "RELATE team_id TO home_team, team_id TO visiting_team" enthält, würden nur Spiele abgerufen, bei denen ein Team selbst teilnimmt. Sie möchten jedoch "(team_id=home_team) OR (team_id=visiting_team)", aber die OR-Klausel wird vom SHAPE-Anbieter nicht unterstützt.
Sie können einen parametrisierten Befehl verwenden, um das gewünschte Ergebnis zu erhalten. Beispiel:
SHAPE {SELECT * FROM teams}
APPEND ({SELECT * FROM games WHERE home_team = ? OR visiting_team = ?}
RELATE team_id TO PARAMETER 0,
team_id TO PARAMETER 1)
Dieses Beispiel nutzt die größere Flexibilität der WHERE-Klausel von SQL, um das gewünschte Ergebnis zu erhalten.