Набор записей. Порядок выборки записей в наборе (ODBC)

Примечание.

Мастер потребителя MFC ODBC недоступен в Visual Studio 2019 и более поздних версиях. При этом вы по-прежнему можете создать потребитель вручную.

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

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

Наборы записей выбирают записи из источника данных посредством драйвера ODBC, передавая ему инструкции SQL. Эти инструкции зависят от того, как разрабатывается и открывается класс набора записей.

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

В приведенной ниже таблице представлены доступные вам возможности при выборке записей.

Как и когда вы можете влиять на набор записей

Ситуация Вы можете
Объявление класса набора записей с помощью мастера добавления класса Укажите таблицу, из которой будет производиться выборка.

Укажите включаемые столбцы.

См. статью Добавление потребителя ODBC MFC.
Завершение реализации класса набора записей Переопределите функции-члены, например расширенную функцию OnSetOptions, чтобы задать параметры для конкретного приложения или изменить значения по умолчанию. Укажите элементы данных параметров, если набор записей должен быть параметризованным.
Создание объекта набора записей (перед вызовом Open) Укажите условие поиска (возможно, составное) для использования в предложении WHERE, которое фильтрует записи. См . набор записей: фильтрация записей (ODBC).

Укажите порядок сортировки для использования в предложении ORDER BY, которое сортирует записи. См . набор записей: сортировка записей (ODBC).

Укажите значения для параметров, добавленных в класс. См. набор записей: параметризация набора записей (ODBC).

|Выполнение запроса набора записей путем вызова Open|Укажите пользовательскую строку SQL вместо строки SQL по умолчанию, заданной мастером. См. раздел CRecordset::Open в справочникепо библиотеке классов и SQL: настройка инструкции SQL набора записей (ODBC).|

|Вызов Requery для повторного запроса текущих значений из источника данных для набора записей|Укажите новые параметры, условие фильтрации или порядок сортировки. См . набор записей: повторение набора записей (ODBC).|

Как набор записей создает свою инструкцию SQL

Когда вы вызываете функцию-член Open объекта набора записей, Open создает инструкцию SQL, используя некоторые или все перечисленные ниже компоненты.

  • Параметр lpszSQL, передаваемый в Open. Если его значение отлично от NULL, этот параметр определяет пользовательскую строку SQL или ее часть. Платформа анализирует строку. Если строка является инструкцией SQL SELECT или инструкцией ODBC CALL, платформа использует ее в качестве инструкции SQL набора записей. Если строка не начинается с "SELECT" или "{CALL", платформа использует предоставленную информацию для построения предложения SQL FROM.

  • Строка, возвращаемая функцией GetDefaultSQL. По умолчанию это имя таблицы, которое вы указали для набора записей в мастере, однако возвращаемое значение можно изменить. Платформа вызывает GetDefaultSQL: если строка не начинается с "SELECT" или "{CALL", она считается именем таблицы, которое используется для построения строки SQL.

  • Элементы данных полей в наборе записей, которые должны быть привязаны к определенным столбцам таблицы. Платформа привязывает столбцы записей к адресам этих элементов, используя их как буферы. Платформа определяет, как связаны элементы данных полей со столбцами таблицы, с помощью вызовов функций RFX или Bulk RFX в функции-члене DoFieldExchange или DoBulkFieldExchange набора записей.

  • Фильтр для набора записей (при его наличии), содержащийся в элементе данных m_strFilter. Платформа использует эту строку для построения предложения SQL WHERE.

  • Порядок сортировки для набора записей (при его наличии), содержащийся в элементе данных m_strSort. Платформа использует эту строку для построения предложения SQL ORDER BY.

    Совет

    Чтобы использовать предложение SQL GROUP BY и, возможно, предложение HAVING, добавьте их в конце строки фильтра.

  • Значения элементов данных параметров, указанные для класса. Значения параметров задаются непосредственно перед вызовом Open или Requery. Платформа привязывает значения параметров к заполнителям "?" в строке SQL. Во время компиляции вы указываете строку с заполнителями. Во время выполнения платформа подставляет данные вместо заполнителей в соответствии с переданными значениями параметров.

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

После построения инструкции функция Open отправляет ее в диспетчер драйверов ODBC (и в библиотеку курсоров ODBC, если она имеется в памяти), который передает ее драйверу ODBC, связанному с конкретной СУБД. Драйвер связывается с СУБД, чтобы произвести выборку из источника данных, и получает первую запись. Платформа загружает запись в элементы данных полей в наборе записей.

Эти способы можно использовать в сочетании для открытия таблиц и для формирования запроса на основе соединения нескольких таблиц. Произведя дополнительную настройку, можно вызывать предварительно определенные запросы (хранимые процедуры), выбирать столбцы таблицы, которые не были известны во время разработки, и привязывать их к полям набора записей, а также выполнять большинство других задач доступа к данным. Задачи, которые невозможно выполнить путем настройки наборов записей, можно реализовать путем вызова функций API ODBC или выполнения инструкций SQL напрямую с помощью CDatabase::ExecuteSQL.

Настройка выбора

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

  • Передайте пользовательскую строку SQL в параметре lpszSQL при вызове функции Open для набора записей. Значение, переданное в параметре lpsqSQL, имеет приоритет над значением, возвращенным функцией-членом GetDefaultSQL.

    Дополнительные сведения см. в статье SQL. Настройка инструкции SQL набора записей (ODBC), описывающая типы инструкций SQL (или частичные инструкции), которые можно передать Open и что с ними делает платформа.

    Примечание.

    Если переданная пользовательская строка не начинается с "SELECT" или "{CALL", MFC предполагает, что она содержит имя таблицы. Это также относится к следующему пункту.

  • Измените строку, которую мастер записывает в функции-члене GetDefaultSQL набора записей. Отредактируйте код функции, чтобы изменить возвращаемое значение. По умолчанию мастер создает функцию GetDefaultSQL, которая возвращает одно имя таблицы.

    Можно сделать так, чтобы функция GetDefaultSQL возвращала любые элементы, которые можно передавать в параметре lpszSQL в функцию Open. Если пользовательская строка SQL в параметре lpszSQL не передана, платформа использует строку, возвращенную функцией GetDefaultSQL. Функция GetDefaultSQL должна возвращать по крайней мере одно имя таблицы. Однако она также может возвращать несколько имен таблиц, полную инструкцию SELECT, инструкцию ODBC CALL и т. д. Список того, что можно передать в lpszSQL или вернутьGetDefaultSQL, см. в статье SQL: Настройка инструкции SQL набора записей (ODBC).

    Если выполняется соединение двух или нескольких таблиц, перепишите функцию GetDefaultSQL, изменив список таблиц в предложении SQL FROM. Дополнительные сведения см. в разделе Recordset: Выполнение соединения (ODBC).

  • Привяжите дополнительные элементы данных полей вручную, возможно, на основе сведений о схеме источника данных, полученных во время выполнения. Элементы данных полей добавляются в класс набора записей, вызовы функций RFX или Bulk RFX для них — в функцию-член DoFieldExchange или DoBulkFieldExchange, а инициализации элементов данных — в конструктор класса. Дополнительные сведения см. в разделе Recordset: динамически привязка столбцов данных (ODBC).

  • Переопределите функции-члены набора записей, например OnSetOptions, чтобы задать параметры для конкретного приложения или изменить значения по умолчанию.

Если набор записей должен быть основан на сложной инструкции SQL, используйте эти способы настройки в определенном сочетании. Например, это может потребоваться, если используются предложения и ключевые слова SQL, которые не поддерживаются наборами записей напрямую, или объединяются несколько таблиц.

См. также

Набор записей (ODBC)
Набор записей. Порядок обновления записей в наборе (ODBC)
Основы ODBC
SQL
Набор записей. Блокировка (ODBC)