パラメーター化コマンドの操作

(特に親 Recordset のサイズと比較した場合に) 大きい子 Recordset を処理しているが、アクセスする必要があるのがいくつかの子チャプターのみである場合は、パラメーター化コマンドを使用するほうが効率的であることがあります。

"非パラメーター化コマンド" は、親と子の両方の Recordset の全体を取得し、親にチャプター列を追加してから、それぞれの親行に関連する子チャプターへの参照を割り当てます。

"パラメーター化コマンド" は、親 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 コレクションのいずれにも関連付けられていません。

パラメーター化 shape コマンドが実行されると、次の処理が行われます。

  1. "親コマンド" が実行され、Customers テーブルから親 Recordset が返されます。

  2. チャプター列が親 Recordset に追加されます。

  3. 親行のチャプター列がアクセスされると、パラメーターの値として customer.cust_id の値を使用して、"子コマンド" が実行されます。

  4. 手順 3 で作成されたデータ プロバイダー行セット内のすべての行を使用して、子 Recordset が設定されます。 この例では、cust_id が customer.cust_id の値と等しい Orders テーブル内のすべての行がそれに当たります。 既定では、親 Recordset へのすべての参照が解放されるまで、子 Recordset はクライアント上でキャッシュされます。 この動作を変更するには、Recordset動的プロパティ[Cache Child Rows] (子行のキャッシュ)False に設定します。

  5. 取得された子行への参照 (つまり、子 Recordset のチャプター) が、親 Recordset の現在の行のチャプター列に配置されます。

  6. 別の行のチャプター列がアクセスされると、手順 3 から 5 が繰り返されます。

[Cache Child Rows] (子行のキャッシュ) 動的プロパティは、既定で True に設定されています。 キャッシュ動作は、クエリのパラメーター値によって異なります。 1 つのパラメーターがあるクエリでは、指定されたパラメーター値の子 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.  

2 つ以上のパラメーターがあるクエリでは、キャッシュされた値とすべてのパラメーター値が一致する場合にのみ、キャッシュされた子が使用されます。

パラメーター化コマンドと複雑な親子関係

パラメーター化コマンドを使用した等結合型階層のパフォーマンスの向上に加えて、パラメーター化コマンドを使用すると、より複雑な親子関係をサポートできます。 たとえば、2 つのテーブルがあるリトル リーグのデータベースを考えます。1 つはチーム (team_id、team_name)、もう 1 つは試合 (date、home_team、visiting_team) で構成されています。

非パラメーター化階層を使用する場合は、各チームの子 Recordset にその完全なスケジュールが含まれるように、チームと試合のテーブルを関連付ける方法はありません。 ホーム スケジュールまたはロード スケジュールを含むチャプターを作成できますが、両方を含むチャプターは作成できません。 これは、RELATE 句により、(pc1=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 コマンド