共用方式為


參數化命令的作業

如果您使用大型子 Recordset (特別是相較於父 Recordset 為大型),但只需要存取幾個子章節,您可能會發現使用參數化命令更有效率。

非參數化命令會同時擷取整個父和子 Recordets、將章節資料行附加至父系,然後為每個父資料列指派相關子章節的參考。

參數化命令會擷取整個父 Recordset,但只會擷取存取章節資料行時的 Recordset 章節。 擷取策略差異可能會帶來顯著的效能優勢。

例如,您可以指定下列項目:

SHAPE {SELECT * FROM customer}   
   APPEND ({SELECT * FROM orders WHERE cust_id = ?}   
   RELATE cust_id TO PARAMETER 0)  

父資料表和子資料表具有相同的資料行名稱,cust_idchild-command 具有「?」預留位置,而 RELATE 子句會參考該預留位置 (也就是 「...PARAMETER 0」)。

注意

PARAMETER 子句只與 shape 命令語法有關。 該子句與 ADO Parameter 物件或 Parameters 集合無關。

執行參數化 shape 命令時,會發生下列情況:

  1. 父命令會執行,並從 Customers 資料表傳回父 Recordset

  2. 章節資料行會附加至父 Recordset

  3. 存取父資料列的章節資料行時,會使用 customer.cust_id 的值做為參數值來執行子命令

  4. 步驟 3 中所建立資料提供者資料列集中的所有資料列都會用來填入子 Recordset。 在此範例中,這是 Orders 資料表中的所有資料列,其中 cust_id 等於 customer.cust_id 的值。 根據預設,子 Recordset 會在用戶端上快取,直到釋放父 Recordset 的所有參考為止。 若要變更此行為,請將 Recordset 動態屬性快取子資料列設定為 False

  5. 所擷取子資料列 (也就是子 Recordset 章節) 的參考會放在父 Recordset 目前資料列的章節資料行中。

  6. 存取另一個資料列的章節資料行時,會重複步驟 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

另請參閱

資料成形範例
正式 Shape 文法
一般 Shape 命令