Реализация доступа к базам данных в среде VISUAL STUDIO.NET на языке С++ с применением ATL
Выборка данных
Для того чтобы приступить к выборке данных, предварительно должны быть открыты источник данных и сеанс. В зависимости от используемого типа аксессора, может потребоваться связывание данных.
На следующей схеме приведена иерархия классов аксессоров.
Класс записи должен содержать переменные члены класса, соответствующие (по типам) полям создаваемого результирующего набора.
Для извлечения данных достаточно выполнить следующие действия:
- Откройте результирующий набор, выполнив функцию Open.
- При использовании аксессора типа CManualAccessor выполните связывание столбцов.
Например:
// Получение информации о столбцах ULONG ulColumns = 0; DBCOLUMNINFO* pColumnInfo = NULL; LPOLESTR pStrings = NULL; // rc - результирующий набор if (rs.GetColumnInfo(&ulColumns, &pColumnInfo, &pStrings) != S_OK) ThrowMyOLEDBException(rs.m_pRowset, IID_IColumnsInfo); // Ошибка выполнения struct MYBIND* pBind = new MYBIND[ulColumns]; // Создание аксессора rs.CreateAccessor(ulColumns, &pBind[0], sizeof(MYBIND)*ulColumns); // Цикл по числу столбцов for (ULONG l=0; l<ulColumns; l++) rs.AddBindEntry(l+1, DBTYPE_STR, sizeof(TCHAR)*40, &pBind[l].szValue, NULL, &pBind[l].dwStatus); rs.Bind(); // Выполнение связывания // Цикл по курсору (результирующему набору) while (rs.MoveNext() == S_OK) { // Извлечение данных // Если не используется автоаксессор, то // вызывается метод rs.GetData() }
Извлечение данных выполняется согласно используемому типу аксессора:
-
При использовании класса типа CAccessor обязательно должен быть класс записи, переменные члены класса которого соответствуют полям таблицы базы данных. Эти члены класса используются для доступа к данным результирующего набора.
Например:
while (rs.MoveNext() == S_OK) { cout<<rs.m_nF3; }
-
При использовании классов типа CDynamicAccessor или CDynamicParameterAccessor данные извлекаются вызовом функций GetValue и GetColumn. При этом тип данных может быть определен вызовом функции GetType.
Например:
while (rs.MoveNext() == S_OK) { // Определение числа столбцов ULONG ulColumns = rs.GetColumnCount(); for (ULONG i=0; i<ulColumns; i++) { rs.GetValue(i); // Извлечение данных } }
-
При использовании класса типа CManualAccessor следует определить переменные для извлечения значений столбцов, связать эти переменные со столбцами, и извлечение данных будет выполняться в эти переменные.
Например:
while (rs.MoveNext() == S_OK) { // использование переменных, определенных // при вызове AddBindEntry. cout<<szF1; }