如果您正在處理一個與父 Recordset相比較大的子系 Recordset,但只需要存取其中少數幾個子節,您可能會發現使用參數化命令更加有效率。
非參數化命令 會擷取整個父系和子系 Recordets、將章節數據行附加至父系,然後為每個父數據列指派相關子章的參考。
參數化命令 擷取整個父系 Recordset ,但在存取章節欄時,只會擷取章節 Recordset 。 擷取策略的差異可能會帶來顯著的效能優勢。
例如,您可以指定以下項目:
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
父資料表和子資料表具有通用的數據行名稱,cust_id。 子命令 具有 “?” 佔位符,而 RELATE 子句參考的則是此佔位符(也就是 “...PARAMETER 0”)。
注意
PARAMETER 子句只與 shape 命令語法有關。 它與 ADO Parameter 物件或 Parameters 集合無關。
執行參數化圖形命令時,會發生下列情況:
執行 父命令,並從 Customers 數據表傳回父 Recordset。
章節欄位已新增至父 Recordset。
當存取父行的章節欄時,會使用 customer.cust_id 的值作為參數來執行 子命令。
在步驟 3 中建立的資料提供者行集中的所有資料列都會用來填入子系 記錄集。 在此範例中,這是 Orders 數據表中的所有數據列,其中cust_id等於 customer.cust_id 的值。 根據預設,子 Recordset會被快取到用戶端,直到所有父 Recordset 的參考被釋放。 若要變更此行為,請將 Recordset動態屬性快取子資料列 設定為 False。
所擷取子數據列的參考(即子 Recordset的章節)會放在父 Recordset之目前數據列的章節欄中。
當存取另一行的章節欄時,會重複步驟 3-5。
動態屬性 快取子數據列 預設會被設定為 True。 快取行為會根據查詢的參數值而有所不同。 在只有單一參數的查詢中,指定參數值的子集 "Recordset" 將會在具有該值的子集要求之間被快取。 下列程式代碼示範這一點:
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.
在具有兩個或多個參數的查詢中,只有在所有參數值都符合快取值時,才會使用快取子系。
參數化命令和複雜的父子系關聯性
除了使用參數化命令來改善等聯結類型階層的效能之外,參數化命令也可以用來支援更複雜的父子式關聯性。 例如,考慮一個小聯盟資料庫,它有兩個資料表:一個是球隊資料表(team_id、team_name),另一個是比賽資料表(日期、home_team、visiting_team)。
使用非參數化階層,無法讓隊伍和比賽表格產生關聯,因此每個隊伍的子 資料集 都無法包含其完整賽程。 您可以建立包含主排程或道路排程的章節,但不能同時包含這兩個章節。 這是因為 RELATE 子句會將您限制為 (pc1=cc1) 和 (pc2=cc2) 形式的父子關係。 因此,如果您的命令包含“RELATE team_id TO home_team,team_id TO visiting_team”,您只會得到一支球隊和自己對戰的比賽。 您想要的是 “(team_id=home_team) OR (team_id=visiting_team),但 Shape 提供者不支援 OR 子句。
若要取得所需的結果,您可以使用參數化命令。 例如:
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)
此範例會利用 SQL WHERE 子句更大的彈性來取得您需要的結果。
注意
使用 WHERE 子句時,參數無法使用 text、ntext 和 image 的 SQL 資料類型,否則會產生包含下列描述的錯誤:Invalid operator for data type。