Funcionamiento de los comandos con parámetros

Si está trabajando con un objeto Recordset secundario grande, especialmente en comparación con el tamaño del objeto Recordset primario, pero necesita tener acceso solo a unos pocos capítulos secundarios, es posible que le resulte más eficaz usar un comando parametrizado.

Un comando no parametrizado recupera los objetos Recordset primarios y secundarios completos, anexa una columna de capítulo al elemento primario y, después, asigna una referencia al capítulo secundario relacionado a cada fila primaria.

Un comando con parámetros recupera todo el objeto Recordset primario, pero solo recupera el objeto Recordset del capítulo cuando se accede a la columna de capítulo. Esta diferencia en la estrategia de recuperación puede producir grandes ventajas en cuanto al rendimiento.

Por ejemplo, puede especificar las siguientes opciones:

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

Las tablas primarias y secundarias tienen un nombre de columna en común, cust_id. El comando secundario tiene un marcador de posición "?" al que hace referencia la cláusula RELATE (es decir, "... PARÁMETRO 0").

Nota

La cláusula PARAMETER pertenece únicamente a la sintaxis del comando de forma. No está asociado al objeto Parameter de ADO ni a la colección Parameters.

Cuando se ejecuta el comando de forma parametrizado, ocurre lo siguiente:

  1. El comando primario se ejecuta y devuelve un objeto Recordset primario de la tabla Customers.

  2. Se anexa una columna de capítulo al objeto Recordset primario.

  3. Cuando se accede a la columna de capítulo de una fila primaria, el comando secundario se ejecuta con el valor de customer.cust_id como valor del parámetro.

  4. Todas las filas del conjunto de filas del proveedor de datos creados en el paso 3 se usan para rellenar el objeto Recordset secundario. En este ejemplo, se trara de todas las filas de la tabla Orders en las que cust_id es igual al valor de customer.cust_id. De forma predeterminada, el objeto Recordsetsecundario se almacenará en caché en el cliente hasta que se liberen todas las referencias al objeto Recordset primario. Para cambiar este comportamiento, establezca la propiedad dinámicaRecordsetCache Child Rows en False.

  5. Una referencia a las filas secundarias recuperadas (es decir, el capítulo del objeto Recordset secundario) se coloca en la columna de capítulo de la fila actual del objeto Recordset primario.

  6. Los pasos 3-5 se repiten cuando se accede a la columna de capítulo de otra fila.

La propiedad dinámica Cache Child Rows se establece en True de forma predeterminada. El comportamiento del almacenamiento en caché varía en función de los valores de parámetro de la consulta. En una consulta con un único parámetro, el objeto Recordset secundario para un valor de parámetro determinado se almacenará en caché entre las solicitudes de un elemento secundario con ese valor. El código siguiente muestra este proceso:

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.  

En una consulta con dos o más parámetros, solo se usa un elemento secundario almacenado en caché si todos los valores de parámetro coinciden con los valores almacenados en caché.

Comandos parametrizados y relaciones primarias y secundarias complejas

Además de usar comandos parametrizados para mejorar el rendimiento de una jerarquía de tipos de combinación equi, los comandos con parámetros se pueden usar para admitir relaciones de elementos primarios y secundarios más complejas. Por ejemplo, considere una base de datos de la Little League con dos tablas: una formada por los equipos (team_id, team_name) y la otra por los partidos (date, home_team, visiting_team).

Con una jerarquía no parametrizada, no hay ninguna manera de relacionar los equipos y las tablas de juegos de forma que el objeto Recordset secundario de cada equipo contenga su programación completa. Puede crear capítulos que contengan el calendario de casa o el calendario de fuera, pero no ambos. Esto se debe a que la cláusula RELATE le limita las relaciones de elementos primarios y secundarios de la fórmula (pc1=cc1) AND (pc2=pc2). Por lo tanto, si su comando incluyera "RELATE team_id TO home_team, team_id TO visiting_team", solo obtendría partidos en los que un equipo estuviera jugando contra sí mismo. Lo que desea es "(team_id=home_team) OR (team_id=visiting_team)", pero el proveedor Shape no admite la cláusula OR.

Para obtener el resultado deseado, puede usar un comando parametrizado. Por ejemplo:

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)   

En este ejemplo se aprovecha la mayor flexibilidad de la cláusula WHERE de SQL para obtener el resultado que necesita.

Nota

Cuando se usan cláusulas WHERE, los parámetros no pueden usar los tipos de datos SQL para text, ntext e image u ocurrirá un error que contenga la siguiente descripción: Invalid operator for data type.

Consulte también

Ejemplo de la forma de datos
Gramática formal de forma
Comandos Shape en General