Набор записей. Параметризация набора записей (ODBC)

Этот раздел относится к классам ODBC библиотеки MFC.

В некоторых случаях вам может потребоваться возможность осуществлять выбор записей во время выполнения на основе информации, которая была получена по результатам вычислений или введена конечным пользователем. В таких случаях можно использовать параметры набора записей.

В этом разделе рассматриваются следующие вопросы.

Параметризованные наборы записей

Параметризованные наборы записей поддерживают передачу параметров во время выполнения. Это дает два важных преимущества.

  • Возможность повышения скорости выполнения.

  • Возможность создавать запросы во время выполнения на основе сведений, которые не были доступны на этапе разработки и были получены по результатам вычислений или введены пользователем.

При вызове метода Open для выполнения запроса набор записей использует данные параметра для заполнения инструкции SQL SELECT. Параметризация поддерживается для любых наборов записей.

Когда следует использовать параметры

Как правило, параметры используются в следующих случаях.

  • Передача аргументов времени выполнения в предопределенный запрос.

    Чтобы передать параметры в хранимую процедуру, необходимо указать полную настраиваемую инструкцию ODBC CALL с заполнителями параметров при вызове метода Open. Таким образом переопределяется заданная по умолчанию инструкция 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
    

    Сведения о том, как правильно использовать кавычки для строк фильтра, см. в разделе Recordset: Filtering Records (ODBC).

    Значение параметра будет изменяться каждый раз, когда вы будете отправлять запрос к набору записей для нового идентификатора учащегося.

    Совет

    Использование параметров намного эффективнее применения обычного фильтра. При работе с параметризованным набором записей база данных обрабатывает инструкцию SQL SELECT всего один раз. Для отфильтрованного набора записей без параметров инструкция SELECT обрабатывается каждый раз при выполнении Requery с новым значением фильтра.

Дополнительные сведения о фильтрах см. в разделе Recordset: Filtering Records (ODBC).

Параметризация класса Recordset

Примечание.

Этот раздел относится к объектам, производным от CRecordset, в которых пакетная выборка строк не реализована. Если вы используете пакетную выборку строк, реализация параметров осуществляется схожим образом. Дополнительные сведения см. в разделе Recordset: извлечение записей в пакетной службе (ODBC).

Прежде чем создавать класс набора записей, определите, какие параметры вам потребуются, какие типы данных они будут иметь, а также как они будут использоваться набором записей.

Параметризация класса набора записей

Примечание.

Мастер потребителя MFC ODBC недоступен в Visual Studio 2019 и более поздних версиях. Его функции по-прежнему можно реализовать вручную.

  1. Чтобы создать нужный класс, запустите мастер потребителя MFC ODBC из диалогового окна Добавить класс.

  2. Укажите элементы данных поля для столбцов набора записей.

  3. После того как мастер запишет класс в файл вашего проекта, перейдите к H-файлу и вручную добавьте нужные элементы данных параметра в объявление класса. Это можно сделать, как показано в следующем примере, в котором демонстрируется получение ответа на запрос "Какие обучающиеся находятся на старшем курсе?"

    class CStudentSet : public CRecordset
    {
    // Field/Param Data
        CString m_strFirstName;
        CString m_strLastName;
        CString m_strStudentID;
        CString m_strGradYear;
    
        CString m_strGradYrParam;
    };
    

    Элементы данных параметра следует добавлять после созданных мастером элементов данных поля. По соглашению к каждому определенному пользователем имени параметра следует добавлять слово "Param".

  4. Измените определение функции-члена DoFieldExchange в CPP-файле. Для каждого элемента данных параметра, добавляемого в класс, добавьте вызов функции RFX. Дополнительные сведения о написании функций RFX см. в разделе "Обмен полями записей: как работает RFX". Перед вызовами RFX в отношении параметров необходимо использовать один вызов:

    pFX->SetFieldType( CFieldExchange::param );
    // RFX calls for parameter data members
    
  5. В конструкторе класса набора записей увеличьте количество параметров, m_nParams.

    Дополнительные сведения см. в разделе "Обмен полями записей": работа с кодом мастера.

  6. При написании кода, который создает объект набора записей этого класса, помещайте символ "?" (знак вопроса) в каждой позиции в строках инструкций SQL, в которых требуется заменять параметр.

    Во время выполнения заполнители "?" заполняются по порядку с использованием передаваемых вами значений параметра. Первый элемент данных параметра, заданный после вызова SetFieldType, заменяет первый заполнитель "?" в строке SQL, второй элемент данных параметра заменяет второй заполнитель "?" и т. д.

Примечание.

Порядок следования параметров имеет значение, поскольку порядок вызовов RFX для параметров в функции DoFieldExchange должен соответствовать порядку расположения заполнителей параметра в строке SQL.

Совет

В большинстве случаев работа осуществляется со строкой, которую вы задаете в элементе данных класса m_strFilter (если таковая есть), однако некоторые драйверы ODBC допускают использование параметров в других предложениях SQL.

Передача значений параметров во время выполнения

Значения параметра необходимо указывать до вызова Open (для нового объекта набора записей) или Requery (для существующего объекта).

Передача значений параметра в объект набора записей во время выполнения

  1. Создайте объект набора записей.

  2. Подготовьте строку или строки, содержащие инструкцию SQL или ее части, например строку m_strFilter. Поместите заполнители "?" в те позиции, в которые будут подставляться данные параметра.

  3. Во время выполнения присвойте значение параметра каждому элементу данных параметра для объекта.

  4. Вызовите функцию-член Open (или Requery для существующего набора записей).

Предположим, вам необходимо указать строку фильтра для набора записей, используя сведения, полученные во время выполнения. Допустим, ранее вы создали набор записей класса CStudentSet с именем rsStudents и теперь хотите выполнить запрос к нему для получения определенной информации об учащемся.

// 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)
Набор записей. Добавление, обновление и удаление записей (ODBC)
Набор записей. Порядок выборки записей в наборе (ODBC)