Как вы загружаете данные в класс базы данных с атрибутами, созданный мастером приложений MFC?

С помощью мастера MFCApplication в Visual C++ 2012, если установлен флажок «Создать класс базы данных с атрибутами», создается заголовок с некоторым специальным синтаксисом (классы с атрибутами C++), которые выглядят следующим образом:

// MFCApplication2Set.h: interface of the CMFCApplication2Set class
//

#pragma once

// code generated on March-05-13, 9:26 AM

[
    db_source(L"Provider=SQLNCLI11.1;..."),
    db_table(L"dbo.tblEmployee")
]
class CMFCApplication2Set
{
public:
... big list of stuff that corresponds to the fields in your db table omitted ...
}

Приведенный выше заголовок соответствует в основном пустому файлу реализации:

// MFCApplication2Set.cpp : implementation of the CMFCApplication2Set class
//

#include "stdafx.h"
#include "MFCApplication2.h"
#include "MFCApplication2Set.h"

#ifdef _DEBUG
#define new DEBUG_NEW
#endif


// CMFCApplication2Set implementation

Это был ВЕСЬ класс реализации. Заметь:

О. Имя родительского класса нигде не указано. B. Здесь происходит какая-то «магия Visual C++», то есть, как новичок в современном C++, я потерялся. db_source документирован здесь, но документация довольно тонкая или, по крайней мере, непрозрачная для меня.

Вопросы:

  1. Меня озадачил этот синтаксис, когда я впервые увидел его, но я понял, что это, вероятно, вариант этого Атрибуты в Visual C++. Это так, верно?

  2. Как я должен использовать эти сгенерированные объекты «атрибутированного класса базы данных»? Я нашел эту документацию, но если вы внимательно посмотрите на эту документацию, то пример кода показывает людям старый и новый способы и не говорит мне, что я хочу знать, а именно, как использовать этот новый объект, для которого среда IDE не может предоставить мне какую-либо документацию или функции завершения кода. Кроме того, поскольку сгенерированный мастером код для класса CMFCApplication2Set не ссылается ни на какие типы или имена классов, я теряюсь. Если бы я мог даже использовать какую-то функцию IDE, чтобы узнать, какие методы и прочее были Волшебно внедрены в этот Волшебный загадочный объект, мне было бы лучше. Единственная мысль, которую я могу придумать, это учиться по-старому и изучать все вещи, которые можно вызвать из старого мира с двумя отдельными типами ATL, а затем каким-то образом научиться их комбинировать.

В двух словах, я ищу минимальный синтаксис, который мне нужно знать, чтобы на самом деле использовать один из этих экземпляров атрибутивного класса базы данных, переменных, поскольку они генерируются мастером в новом приложении MFC. Показанный ниже экземпляр является членом класса документов MFC, а CMFCApplication2Set m_MFCApplication2Set объявлено как поле внутри класса документов MFC.

Я пробовал использовать этот «нетипизированный объект». Этот объект имеет много полей данных (m_X) и имеет только один метод, который отображается в автодополнении кода IDE, называемый GetRowSetProperties. Благодаря тому, что происходит магия или инъекция, этот сгенерированный атрибутированный класс базы данных (который явно ничего не наследует) остается для меня полной загадкой во время редактирования и во время компиляции.

Вот я просто пытаюсь проверить эту штуку, чтобы увидеть, инициализировалась ли она даже при запуске своего конструктора:

BOOL CMFCApplication2Doc::OnNewDocument() {     if (!CDocument::OnNewDocument())        return FALSE;

        TRACE( m_MFCApplication2Set.m_AStringFieldName); // outputs NOISE.



    return TRUE; }

Во время компиляции и редактирования IDE не дает мне НИКАКОЙ помощи о типах, участвующих в этом «анонимном» классе, который наследуется ни от чего, но получает множество секретных полномочий из-за какой-то инъекции через те атрибуты, которые я предполагаю. Во время отладки я вижу, что в этом классе C++ есть нечто большее, чем просто набор полей данных, но это все равно не помогает мне понять, как его использовать. Минимальный пример кода использования одного из них для получения набора записей из базы данных был бы отличным.

введите здесь описание изображения

Обновление: вызов OpenDataSource забавен, потому что он компилируется, но IDE не считает, что он должен быть действительным. Тем не менее, он работает и возвращает 0 в качестве результата, но на самом деле это не инициализирует этот CThingyThatVisualStudioGaveYouToYouDontKnowWhatIt:

введите здесь описание изображения


person Warren P    schedule 05.03.2013    source источник


Ответы (1)


Это устаревшая функция кода C++ с атрибутами. Препроцессор расширяет код и заменяет атрибуты реальными базовыми классами. Если вы включите генерацию этих промежуточных файлов, вам станет понятнее:

введите здесь описание изображения

У вас будут сгенерированы файлы XXX.mrg.cpp и XXX.mrg.h, которые вы сможете просмотреть и увидеть настоящий код C++, отправленный компилятору.

Атрибуты будут заменены замененными базовыми классами, такими картами, как BEGIN_COLUMN_MAP и т. д. Исходный код с атрибутами компактен, но эта функция устарела, и при просмотре расширенного кода должно быть легко (при необходимости) удалить атрибуты и скопировать расширенный код прямо в исходный код. Это легко с атрибутами DB и сложнее с атрибутами COM, поскольку внутренние зависимости являются наиболее сложными.

person Roman R.    schedule 05.03.2013
comment
Я не могу найти ссылку в документе на то, что он устарел. - person Warren P; 06.03.2013
comment
MSDN не помечает их как устаревшие, но нет ничего, что подтверждало бы обратное. Это была экспериментальная функция в Visual Studio 2003, 2005, затем она была удалена как опция для новых проектов ATL, которые с тех пор также не разрабатывались. Некоторые говорят, что книга ATL Internals stu">не рекомендует их для новых проектов. - person Roman R.; 06.03.2013
comment
Странно, что мастер приложений MFC все еще генерирует этот уродливый синтаксис. - person Warren P; 07.03.2013