Набор записей. Параметризация набора записей (ODBC)
Обновлен: Ноябрь 2007
Данный раздел относится к классам ODBC библиотеки MFC.
В некоторых случаях может понадобиться выбор записей во время выполнения, используя вычисленные или полученные от конечного пользователя сведения. Параметры набора записей позволяют это сделать.
В данном разделе описывается следующее.
Предназначение параметризированного набора записей.
Когда и зачем нужно параметризировать набор записей.
Способы объявления членов-параметров данных в классе набора записей.
Способы передачи сведений о параметрах объекту набора записей во время выполнения.
Параметризированные наборы записей
Параметризированные наборы записей позволяют передавать сведения о параметрах во время выполнения. Данная функция обладает двумя преимуществами.
Может повышать скорость выполнения операции.
Позволяет создать запрос во время выполнения, основываясь на информации, которая является недоступной во время разработки, например информации, полученной от пользователя или вычисленной во время выполнения.
При вызове функции Open с целью запуска запроса набор записей использует сведения о параметрах для завершения инструкции SQL SELECT. Параметризироваться могут любые наборы записей.
Когда используются параметры
Обычно параметры используются в следующих случаях.
При передаче аргументов времени выполнения предопределенному запросу.
Для передачи параметров в хранимую процедуру при вызове функции Open необходимо указать полный пользовательский оператор ODBC CALL (с параметрами-местозаполнителями), переопределяя инструкцию набора записей SQL по умолчанию. Дополнительные сведения см. в разделе CRecordset::Open в Справочнике по библиотеке классов и в разделах SQL. Настройка инструкции SQL набора записей (ODBC) и Набор записей. Объявление класса для предопределенного запроса (ODBC).
Эффективное выполнение нескольких повторных запросов с использованием разных сведений о параметрах.
Например, при каждом поиске конечным пользователем определенного студента в базе данных регистрации студентов можно указывать имя или идентификатор студента в качестве параметра, полученного от пользователя. В результате при вызове функции-члена Requery набора записей запрос выбирает запись этого студента.
Строка фильтра набора записей, хранимая в m_strFilter, может выглядеть следующим образом.
"StudentID = ?"
Предположим, что идентификатор студента получен в виде переменной strInputID. Если задается значение параметра strInputID (например, идентификатор студента "100"), то значение переменной привязывается к параметру-местозаполнителю, представленному как "?" в строке фильтра.
Значение параметра присваивается следующим образом:
strInputID = "100"; ... m_strParam = strInputID;
Строку фильтра не следует устанавливаться таким образом:
m_strFilter = "StudentID = 100"; // 100 is incorrectly quoted // for some drivers
Инструкции по надлежащему использованию кавычек см. в разделе Набор записей. Фильтрация записей (ODBC).
Значение параметра изменяется при каждом запросе набора записей для нового идентификатора студента.
Совет. Применение параметра считается более эффективным, чем применение фильтра. Для параметризированного набора записей база данных проводит одну обработку инструкции SQL SELECT. Для набора записей, использующего фильтр (без применения параметров), инструкция SELECT обрабатывается при каждом вызове Requery с новым значением фильтра.
Дополнительные сведения о фильтрах см. в разделе Набор записей. Фильтрация записей (ODBC).
Параметризация класса набора записей
Примечание. |
---|
В данном подразделе рассматриваются объекты, являющиеся производными от класса CRecordset, в котором не реализована массовая выборка строк. При использовании групповой выборки строк процесс реализации параметров будет идентичным. Дополнительные сведения см. в разделе Набор записей. Групповая выборка записей (ODBC). |
Перед созданием класса набора записей необходимо выбрать параметры, определить их тип данных и принцип использования в наборе записей.
Параметризация класса набора записей
Создайте класс, запустив Mастера потребителей МFC ODBC с помощью команды Добавить класс.
Укажите члены-полей данных в столбцах набора записей.
После того как мастер пропишет класс в файл проекта, необходимо открыть H-файл и вручную добавить в объявление класса один или несколько членов-параметров данных. Добавление может выглядеть следующим образом, фрагмент класса моментального снимка отвечает на запрос "Какие студенты обучаются на старших курсах?"
class CStudentSet : public CRecordset { // Field/Param Data CString m_strFirstName; CString m_strLastName; CString m_strStudentID; CString m_strGradYear; CString m_strGradYrParam; };
Добавьте члены-параметры данных после созданных мастером членов-полей данных. Согласно правилам наименования, к каждому определенному пользователем имени параметра добавляется слово "Param".
Измените определение функции-члена DoFieldExchange в CPP-файле. Добавьте вызов функции RFX к каждому члену-параметру данных, добавленному к классу. Дополнительные сведения про написание функций RFX см. в разделе Обмен полей записи. Принцип работы RFX. Для параметров единичный вызов должен предшествовать вызовам RFX.
pFX->SetFieldType( CFieldExchange::param ); // RFX calls for parameter data members
В конструкторе класса набора записей необходимо увеличить количество параметров m_nParams.
Дополнительные сведения см. в разделе Обмен полей записей. Работа с кодом мастера.
При написании кода, создающего объект набора записей для данного класса, в местах замены параметров в строке инструкции SQL размещается символ "?" (знак вопроса).
Во время выполнения местозаполнители "?" заполняются (по порядку) переданными значениями параметров. Первый член-параметр данных устанавливается после того как вызов SetFieldType заменяет первый "?" в строке SQL, второй член-параметр данных заменяет следующий "?" и т. д.
Примечание. |
---|
Важно соблюдать порядок размещения параметров: последовательность вызовов параметров RFX в функции DoFieldExchange должна соответствовать последовательности размещения параметров-местозаполнителей в строке SQL. |
Совет. |
---|
Наиболее подходящей строкой считается строка, указанная для члена данных класса m_strFilter (если задана), несмотря на то, что некоторые драйверы ODBC могут допускать параметры в других предложениях языка SQL. |
Передача значений параметров во время выполнения
Указывать значения параметров необходимо перед вызовом функций Open (для нового объекта набора записей) или Requery (для существующего).
Передача значений параметров объекту набора записей во время выполнения
Создайте объект набора записей.
Подготовьте одну или несколько строк, таких как m_strFilter, содержащих инструкцию SQL или ее часть. Поставьте местозаполнители "?" в местах размещения сведений о параметрах.
Присвойте значение выполняющегося параметра каждому члену-параметру данных объекта.
Вызовите функцию-член Open (или Requery для существующего набора данных).
Например, допустим, что необходимо указать строку фильтра для набора данных, используя информацию, полученную во время выполнения. Предположим, что набор записей класса CStudentSet был создан ранее под именем rsStudent, и теперь необходимо сделать на него запрос для получения определенной информации о студентах.
// Set up a filter string with
// parameter placeholders
rsStudents.m_strFilter = "GradYear <= ?";
// Obtain or calculate parameter values
// to pass--simply assigned here
CString strGradYear = GetCurrentAcademicYear( );
// Assign the values to parameter data members
rsStudents.m_strGradYrParam = strGradYear;
// Run the query
if( !rsStudents.Requery( ) )
return FALSE;
В наборе записей будут отображены сведения о студентах, чьи записи соответствуют условиям, указанным в фильтре, который был создан на основе параметров выполнения. В нашем случае набор записей будет содержать сведения про всех студентов старших курсов.
Примечание. |
---|
При необходимости установите значение NULL для члена-параметра данных с помощью члена SetParamNull. Проверить, установлено ли значение NULL для параметра можно с помощью члена IsFieldNull. |
См. также
Основные понятия
Набор записей. Добавление, обновление и удаление записей (ODBC)