Операция параметризованных команд
Если вы работаете с большим дочерним Recordset, особенно по сравнению с размером родительско го набора записей, но вам может потребоваться доступ только к нескольким дочерним главам, вы можете найти его более эффективным для использования параметризованной команды.
не параметризованная команда извлекает все родительские и дочерние наборы записей, добавляет столбец главы к родительскому элементу, а затем назначает ссылку на связанную дочернюю главу для каждой родительской строки.
Параметризованная команда извлекает весь родительский Набор записей, но извлекает только главу Recordset при доступе к столбцу главы. Эта разница в стратегии извлечения может дать значительные преимущества производительности.
Например, можно указать следующее:
SHAPE {SELECT * FROM customer}
APPEND ({SELECT * FROM orders WHERE cust_id = ?}
RELATE cust_id TO PARAMETER 0)
Родительские и дочерние таблицы имеют общее имя столбца, cust_id. дочерней команды имеет заполнитель "?", к которому относится предложение RELATE (т. е. "... ПАРАМЕТР 0").
Заметка
Предложение PARAMETER относится исключительно к синтаксису команды фигуры. Он не связан ни с объектом параметра ADO , ни с коллекцией Parameters .
При выполнении параметризованной команды фигуры происходит следующее:
Команда выполняется и возвращает набор записей из таблицы клиентов, связанный с родительской командой.
Столбец главы добавляется к родительскому Recordset.
При доступе к столбцу главы родительской строки выполняется команда дочернего элемента, используя значение customer.cust_id в качестве значения параметра.
Все строки в наборе строк поставщика данных, созданном на шаге 3, используются для заполнения дочернего набора записей. В этом примере, это все те строки в таблице Orders, в которых cust_id равен значению customer.cust_id. По умолчанию дочерний набор записейбудет кэширован на клиенте, пока все ссылки на родительский набор записей не будут выпущены. Чтобы изменить это поведение, задайте для динамического свойства Recordsetкэша дочерних строк значение в False.
Ссылка на извлеченные дочерние строки (т. е. глава дочернего набора записей ) помещается в столбец главы текущей строки родительского набора записей .
Шаги 3-5 повторяются при доступе к столбцу главы другой строки.
Динамическому свойству Cache Child Rows по умолчанию присвоено значение True. Поведение кэширования зависит от значений параметров запроса. В запросе с одним параметром дочерний набор данных для заданного значения параметра будет кэшироваться между запросами для дочернего элемента с этим значением. В следующем коде показано следующее:
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.
В запросе с двумя или более параметрами кэшированный дочерний элемент используется только в том случае, если все значения параметров соответствуют кэшируемым значениям.
Параметризованные команды и сложные родительские дочерние отношения
Помимо использования параметризованных команд для повышения производительности в иерархии типов типа equi-join, параметризованные команды можно также использовать для поддержки более сложных родительско-дочерних отношений. Например, рассмотрим базу данных Little League с двумя таблицами: одна из них содержит команды (team_id, team_name), другая – игры (дата, home_team, visiting_team).
Используя не параметризованную иерархию, невозможно связать таблицы команд и игр таким образом, чтобы дочерний Набор записей для каждой команды содержит полное расписание. Вы можете создавать главы, содержащие домашнее расписание или расписание дорожного движения, но не оба. Это связано с тем, что предложение RELATE ограничивает отношения между родительскими и дочерними элементами вида (pc1=cc1) И (pc2=pc2). Таким образом, если ваша команда включала команду "RELATE team_id TO home_team, team_id TO visiting_team", то вы получите только игры, где команда играла против самой себя. Требуется значение "(team_id=home_team) OR (team_id=visiting_team)", но поставщик фигур не поддерживает предложение 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 параметры не могут использовать типы данных SQL для текст, ntext и image, иначе возникнет ошибка, содержащая следующее описание: Invalid operator for data type
.
См. также
Пример формирования данных
Грамматика форм
Команды фигур в общих