С помощью мастера 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 документирован здесь, но документация довольно тонкая или, по крайней мере, непрозрачная для меня.
Вопросы:
Меня озадачил этот синтаксис, когда я впервые увидел его, но я понял, что это, вероятно, вариант этого Атрибуты в Visual C++. Это так, верно?
Как я должен использовать эти сгенерированные объекты «атрибутированного класса базы данных»? Я нашел эту документацию, но если вы внимательно посмотрите на эту документацию, то пример кода показывает людям старый и новый способы и не говорит мне, что я хочу знать, а именно, как использовать этот новый объект, для которого среда 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:

