Visual C++ 2012 で MFCApplication ウィザードを使用し、[属性付きデータベース クラスを生成する] をオンにすると、次のような特別な構文 (属性付き 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
それが全体の実装クラスでした。次の点に注意してください。
A. 親クラス名がどこにも指定されていません。B. ここでは「Visual C++ マジック」が行われています。つまり、最新の C++ の初心者である私には戸惑います。
ここdb_source
に文書化されていますが、文書はかなり薄いか、少なくとも私には不透明です。
質問:
この構文を最初に見たときは戸惑いましたが、おそらくVisual C++のこの属性機能の変形であることがわかりました。それですよね?
これらの生成された「属性付きデータベース クラス」オブジェクトをどのように使用するつもりですか? このドキュメンテーションを見つけましたが、そのドキュメンテーションを注意深く見ると、そのコード サンプルは人々に古い方法と新しい方法を示しており、IDE ではできないこの新しいオブジェクトの使用方法を知りたいことを教えてくれません。ドキュメントやコード補完機能があれば教えてください。また、
CMFCApplication2Set
ウィザードによって生成されたクラスは、型やクラス名を参照していません。迷っています。なんらかの IDE 機能を使用して、この魔法のような謎のオブジェクトに魔法のように注入されたメソッドやものを知ることができれば、もっとうまくいくでしょう。私が考えることができる唯一の考えは、古い方法を学び、古い 2 つの別個の ATL 型の世界から呼び出すことができるすべてのものを学び、それらを組み合わせる方法を学ぶことです。
簡単に言えば、ウィザードによって新しい MFC アプリで生成される、これらの属性付きデータベース クラス インスタンスの 1 つである変数を実際に使用するために知っておく必要がある最小限の構文を探しています。以下に示すインスタンスは、MFC ドキュメント クラスのメンバーであり、MFC ドキュメント クラスCMFCApplication2Set m_MFCApplication2Set
内のフィールドとして宣言されています。
私が試したのは、この「型指定されていないオブジェクト」を使用することです。このオブジェクトには多数のデータ フィールド (m_X) があり、IDE コード補完に表示されるメソッドは 1 つだけGetRowSetProperties
です。なんらかの魔法やインジェクションが行われているおかげで、この生成された属性付きデータベース クラス (目に見えて何も継承していない) は、編集時とコンパイル時に私にとって完全な謎です。
これは、コンストラクターが実行されたときに自分自身を初期化したかどうかを確認するために、このことを調べようとしているところです。
BOOL CMFCApplication2Doc::OnNewDocument() { if (!CDocument::OnNewDocument()) return FALSE;
TRACE( m_MFCApplication2Set.m_AStringFieldName); // outputs NOISE.
return TRUE; }
コンパイル時と編集時に、IDE は、何も継承しないこの「匿名」クラスに含まれる型について何の助けにもなりませんが、私が推測している属性を介したある種のインジェクションのために多くの秘密の力を取得します。デバッグ時に、この C++ クラスには多数のデータ フィールドがあることがわかりますが、それでも使用方法を理解するのには役立ちません。これらのいずれかを使用してデータベースからレコードセットを取得する最小限のコード サンプルは素晴らしいでしょう。
更新: 呼び出しOpenDataSource
は楽しいものです。コンパイルはされますが、IDE はそれが有効であるとは見なさないからです。それにもかかわらず、実行され、結果として 0 が返されますが、実際にはこのCThingyThatVisualStudioGaveYouThatYouDontKnowWhatItIsは初期化されません。