Примечание.
Для доступа к этой странице требуется авторизация. Вы можете попробовать войти или изменить каталоги.
Для доступа к этой странице требуется авторизация. Вы можете попробовать изменить каталоги.
Этот раздел относится к классам ODBC библиотеки MFC.
Наборы записей управляют привязкой столбцов таблицы, которые вы указываете во время проектирования, но иногда может возникнуть необходимость привязать столбцы, которые не были известны вам на этапе проектирования. В этом разделе рассматриваются следующие вопросы.
Примечание.
Этот раздел относится к объектам, производным от CRecordset, в которых пакетное получение строк не реализовано. Если вы используете пакетное получение строк, описанные методы, как правило, не рекомендуется применять. Для получения дополнительной информации о выборке строк по принципу массовой выборки см. в разделе Recordset: Выборка записей большими партиями (ODBC).
Когда возможно динамическое привязывание столбцов
Примечание.
Мастер потребителя MFC ODBC недоступен в Visual Studio 2019 и более поздних версиях. Вы по-прежнему можете создать пользователя вручную.
Во время проектирования мастер приложений MFC или мастер MFC ODBC Consumer (доступен в диалоговом окне Добавление класса) создает классы наборов записей на основе известных таблиц и столбцов в источнике данных. Со времени разработки баз данных до момента их использования во время выполнения приложения их таблицы и столбцы могут меняться. Ты или другой пользователь могут добавить или удалить таблицу или добавить или удалить столбцы в таблице, с которой связан набор записей приложения. Такое случается не со всеми приложениями, обращающимися к данным, но если все же эта проблема возникла, то как решить ее, не прибегая к реструктуризации и повторной компиляции? Цель этой статьи — дать ответ на этот вопрос.
В этой статье описывается наиболее распространенный сценарий, в котором требуется использовать динамическую привязку столбцов: вы начинаете с набора записей на основе известной схемы базы данных, но во время выполнения появляются дополнительные столбцы. В статье предполагается, что дополнительные столбцы соответствуют участникам данных полей CString, что является наиболее распространенным случаем, однако приводятся рекомендации для управления другими типами данных.
Добавив немного кода, вы можете:
Ваш набор записей по-прежнему содержит элементы данных для столбцов, которые были известны во время разработки. Он также содержит небольшой объем дополнительного кода, который динамически определяет, были ли добавлены новые столбцы в целевую таблицу, и, если да, привязывает эти новые столбцы к динамически выделяемому хранилищу (а не к элементам данных в наборе записей).
Другие сценарии динамической привязки, такие как удаление таблиц или столбцов, в этой статье не рассматриваются. В таких случаях необходимо использовать вызовы API ODBC более непосредственным образом. Дополнительные сведения см. в справочнике программиста ODBC.
Динамическое связывание столбцов
Для динамической привязки столбцов необходимо знать (или иметь возможность определить) имена дополнительных столбцов. Кроме того, необходимо выделить хранилище для дополнительных элементов данных полей, задать их имена и типы, а также указать количество добавляемых столбцов.
Далее будут упоминаться два разных набора записей. Первый — это главный набор записей, который выбирает записи из целевой таблицы. Второй — это специальный набор записей столбцов, который служит для получения сведений о столбцах в целевой таблице.
Общий процесс
В самом общем виде процедура выглядит так.
Вы создаете объект главного набора записей.
При необходимости передайте указатель на открытый объект
CDatabaseили предоставьте сведения о подключении к набору записей столбца каким-либо иным образом.Примите меры для динамического добавления столбцов.
См. раздел "Добавление столбцов" ниже.
Откройте основной набор записей.
Набор записей выбирает записи и использует механизм обмена полями записей (RFX) для привязки как статических столбцов (сопоставленных с элементами данных полей в наборе записей), так и динамических столбцов (сопоставленных с дополнительным выделенным хранилищем).
Добавление столбцов
Для динамической привязки добавленных столбцов во время выполнения необходимо выполнить указанные ниже действия.
Определите столбцы, имеющиеся в целевой таблице, во время выполнения. Извлеките из этих сведений список столбцов, которые были добавлены в таблицу с того момента, как был создан класс набора записей.
Рекомендуется использовать класс набора записей столбцов, который запрашивает сведения о столбцах в целевой таблице (например, их имена и типы данных) из источника данных.
Предоставьте хранилище для новых элементов данных полей. Поскольку ваш класс основного набора записей не содержит членов данных полей для неизвестных столбцов, следует обеспечить место для хранения имен, результатов и, возможно, информации о типах данных (если столбцы имеют разные типы данных).
Один из способов — создать один или несколько динамических списков: один для имен новых столбцов, другой для итоговых значений, а третий для типов данных (если необходимо). Эти списки, особенно список значений, предоставляют сведения и место для хранения, которые требуются для привязки. Построение списков показано на рисунке ниже.
Создание списков столбцов для динамической привязкиДля каждого добавленного столбца добавьте вызов функции RFX в функции
DoFieldExchangeглавного набора записей. Эти вызовы RFX выполняют всю работу по получению записи, включая дополнительные столбцы, и привязке столбцов к элементам данных набора записей или динамически выделяемому хранилищу.Один из подходов — добавить в основную функцию набора записей
DoFieldExchangeцикл, который будет последовательно обрабатывать список новых столбцов и вызывать соответствующую функцию RFX для каждого из них. При каждом вызове RFX необходимо передавать имя столбца из списка имен столбцов и место хранения в соответствующем элементе списка итоговых значений.
Списки столбцов
В таблице ниже представлены четыре списка, с которыми вам нужно работать.
| Список | Описание |
|---|---|
| Текущие столбцы таблицы | (Список 1 на рисунке.) Список столбцов, которые имеются в настоящее время в таблице в источнике данных. Этот список может совпадать со списком текущих привязанных столбцов в наборе записей. |
| Привязанные столбцы набора записей | Список столбцов, привязанных в наборе записей (см. Список 2 на рисунке). Эти столбцы уже содержат выражения RFX в функции DoFieldExchange. |
| Динамически привязываемые столбцы | (Список 3 на рисунке.) Список столбцов, имеющихся в таблице, но отсутствующих в наборе записей. Это столбцы, которые необходимо привязать динамически. |
| Значения динамических столбцов | (Список 4 на рисунке.) Список мест хранения значений, извлеченных из столбцов, которые привязываются динамически. Элементы этого списка однозначно соответствуют столбцам для динамической привязки по принципу один к одному. |
Создание списков
Получив общее представление, можно переходить к деталям. Далее в этой статье описываются процедуры создания списков, представленных в разделе Списки столбцов. Процедуры направляют вас через процесс.
Определение столбцов таблицы, не входящих в набор записей
Создайте список («Привязанные столбцы набора записей», как в списке 2 на рисунке), который содержит список столбцов, уже привязанных в вашем главном наборе записей. Затем создайте список ("Столбцы для динамической привязки", производный от "Текущие столбцы таблицы" и "Привязанные столбцы набора записей"), который содержит имена столбцов, имеющихся в таблице в источнике данных, но отсутствующих в главном наборе записей.
Определение имен столбцов, отсутствующих в наборе записей ("Столбцы для динамической привязки")
Создайте список столбцов, которые уже привязаны в главном наборе записей ("Привязанные столбцы набора записей").
Один из подходов — создание связанных столбцов набора записей на этапе проектирования. Чтобы получить имена столбцов, можно просмотреть вызовы функций RFX в функции
DoFieldExchangeнабора записей. Затем создайте список как массив, инициализированный именами.Например, на рисунке показаны "Bound-Recordset-Columns" (список 2), содержащие три элемента. В списке Bound-Recordset-Columns отсутствует столбец Phone, имеющийся в списке Current-Table-Columns (список 1).
Сравните списки "Текущие столбцы таблицы" и "Привязанные столбцы набора записей", чтобы сформировать список столбцов, которые еще не привязаны в главном наборе записей ("Столбцы для динамической привязки").
Один из подходов — выполнить параллельный перебор списка столбцов в таблице ("Текущие столбцы таблицы") и списка столбцов, уже привязанных в наборе записей ("Привязанные столбцы набора записей"), во время выполнения. Поместите в список "Столбцы для динамической привязки" имена из списка "Текущие столбцы таблицы", которых нет в списке "Привязанные столбцы набора записей".
Например, на иллюстрации показан список "Столбцы для динамической привязки" (список 3) с одним элементом — столбцом Phone, который есть в списке "Текущие столбцы таблицы" (список 1), но которого нет в списке "Столбцы привязанного набора записей" (список 2).
Создайте список "Значения из динамических столбцов" (как в списке 4 на иллюстрации), в котором будут храниться данные, соответствующие каждому имени столбца, включенному в ваш список "Столбцы для динамической привязки".
Элементы этого списка выступают в качестве новых элементов данных полей в наборе записей. Они представляют собой места хранения, к которым привязаны динамические столбцы. Описание списков см. в разделе Списки столбцов.
Предоставление хранилища для новых столбцов
Далее настройте места для хранения столбцов, которые будут привязываться динамически. Для этого нужно предоставить элемент списка, в котором будет храниться значение столбца. Эти места хранения соответствуют переменным-членам набора записей, в которых хранятся статически привязанные столбцы.
Для предоставления динамического хранилища для новых столбцов (Динамические значения столбцов)
Создайте список "Динамические значения столбцов", аналогичный списку "Столбцы для динамического связывания", для хранения данных каждого столбца.
Например, на рисунке показаны динамические значения столбцов (список 4) с одним элементом
CString: объект, содержащий фактический номер телефона для текущей записи: "555-1212".Чаще всего "Dynamic-Column-Values" содержит элементы типа
CString. Если вы работаете со столбцами разных типов, нужен список, который может содержать элементы различных типов.
Результатом предыдущих процедур являются два основных списка: столбцы для динамического связывания, содержащие имена столбцов, и значения динамических столбцов, содержащие значения в столбцах текущей записи.
Совет
Если новые столбцы имеют разные типы данных, может потребоваться дополнительный список, каждый элемент которого определяет тип соответствующего элемента в списке столбцов. (Для этого можно использовать значения AFX_RFX_BOOL, AFX_RFX_BYTE и т. д. Эти константы определены в AFXDB.H.) Выберите тип списка на основе представления типов данных столбцов.
Добавление вызовов RFX для привязки столбцов
Наконец, организуйте динамическую привязку, добавив вызовы RFX для новых столбцов в функцию DoFieldExchange.
Динамическое добавление вызовов RFX для новых столбцов
- В функции-члене
DoFieldExchangeглавного набора записей добавьте код, который проходит по вашему списку новых столбцов ("Столбцы для динамического связывания"). В каждом цикле должны извлекаться имя столбца из списка "Столбцы для динамической привязки" и итоговое значение для столбца из списка "Значения из динамических столбцов". Передайте эти элементы в вызов функции RFX, соответствующий типу данных столбца. Описание списков см. в разделе Списки столбцов.
В общем случае при вызовах функции RFX_Text вы извлекаете объекты CString из списков, как в следующих строках кода, где "Столбцы для динамической привязки" — это CStringList с именем m_listName, а "Значения из динамических столбцов" — CStringList с именем m_listValue.
RFX_Text( pFX,
m_listName.GetNext( posName ),
m_listValue.GetNext( posValue ));
Дополнительные сведения о функциях RFX см. в разделе Макросы и глобальные объекты в справочнике по библиотеке классов.
Совет
Если новые столбцы имеют разные типы данных, используйте в цикле оператор switch для вызова соответствующей функции RFX для каждого типа.
Когда платформа вызывает DoFieldExchange во время процесса Open с целью привязки столбцов к набору записей, вызовы RFX привязывают статические столбцы. Цикл многократно вызывает функции RFX для динамических столбцов.
См. также
Набор записей (ODBC)
Набор записей. Работа с большими элементами данных (ODBC)