參數化命令的作業
如果您使用大型子 Recordset (特別是相較於父 Recordset 為大型),但只需要存取幾個子章節,您可能會發現使用參數化命令更有效率。
非參數化命令會同時擷取整個父和子 Recordets、將章節資料行附加至父系,然後為每個父資料列指派相關子章節的參考。
參數化命令會擷取整個父 Recordset,但只會擷取存取章節資料行時的 Recordset 章節。 擷取策略差異可能會帶來顯著的效能優勢。
例如,您可以指定下列項目:
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
父資料表和子資料表具有相同的資料行名稱,cust_id。 child-command 具有「?」預留位置,而 RELATE 子句會參考該預留位置 (也就是 「...PARAMETER 0」)。
注意
PARAMETER 子句只與 shape 命令語法有關。 該子句與 ADO Parameter 物件或 Parameters 集合無關。
執行參數化 shape 命令時,會發生下列情況:
父命令會執行,並從 Customers 資料表傳回父 Recordset。
章節資料行會附加至父 Recordset。
存取父資料列的章節資料行時,會使用 customer.cust_id 的值做為參數值來執行子命令 。
步驟 3 中所建立資料提供者資料列集中的所有資料列都會用來填入子 Recordset。 在此範例中,這是 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) 組成,另一個由遊戲 (date、home_team visiting_team) 組成。
使用非參數化階層,就無法讓小組和遊戲資料表產生關聯,讓每個小組的子 Recordset 包含其完整排程。 您可以建立包含住家排程或道路排程的章節,但不能同時包含這兩個章節。 這是因為 RELATE 子句會限制您 (pc1=cc1=cc1) AND (pc2=pc2) 表單的父子關聯性。 因此,如果您的命令包含「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
。