次の方法で共有


ウィザードで生成されたアクセサーのフィールド ステータスのデータ メンバー

ATL OLE DB コンシューマー ウィザードを使用してコンシューマーを作成するときに、列マップで指定した各フィールドのユーザー レコード クラスにデータ メンバーが生成されます。各データ メンバーは DWORD 型であり、それぞれのフィールドに対応するステータス値を保持します。

たとえば、m_OwnerID データ メンバーでは、フィールド ステータス用の追加データ メンバー (dwOwnerIDStatus) とフィールド長用のもう 1 つの追加データ メンバー (dwOwnerIDLength) が生成されます。また、COLUMN_ENTRY_LENGTH_STATUS エントリで列マップも生成されます。

コードは次のようになります。

[db_source("insert connection string")]
[db_command(" \
   SELECT \
      Au_ID, \
      Author, \
      `Year Born`, \
      FROM Authors")]

class CAuthors
{
public:

   // The following wizard-generated data members contain status 
   // values for the corresponding fields in the column map. You 
   // can use these values to hold NULL values that the database 
   // returns or to hold error information when the compiler returns 
   // errors. See "Field Status Data Members in Wizard-Generated 
   // Accessors" in the Visual C++ documentation for more information 
   // on using these fields.
   DWORD m_dwAuIDStatus;
   DWORD m_dwAuthorStatus;
   DWORD m_dwYearBornStatus;

   // The following wizard-generated data members contain length
   // values for the corresponding fields in the column map.
   DWORD m_dwAuIDLength;
   DWORD m_dwAuthorLength;
   DWORD m_dwYearBornLength;

BEGIN_COLUMN_MAP(CAuthorsAccessor)
   COLUMN_ENTRY_LENGTH_STATUS(1, m_AuID, dwAuIDLength, dwAuIDStatus)
   COLUMN_ENTRY_LENGTH_STATUS(2, m_Author, dwAuthorLength, dwAuthorStatus)
   COLUMN_ENTRY_LENGTH_STATUS(3, m_YearBorn, dwYearBornLength, dwYearBornStatus)
END_COLUMN_MAP()

   [ db_column(1, status=m_dwAuIDStatus, length=m_dwAuIDLength) ] LONG m_AuID;
   [ db_column(2, status=m_dwAuthorStatus, length=m_dwAuthorLength) ] TCHAR m_Author[51];
   [ db_column(3, status=m_dwYearBornStatus, length=m_dwYearBornLength) ] SHORT m_YearBorn;

   void GetRowsetProperties(CDBPropSet* pPropSet)
   {
      pPropSet->AddProperty(DBPROP_IRowsetChange, true);
      pPropSet->AddProperty(DBPROP_UPDATABILITY, DBPROPVAL_UP_CHANGE | DBPROPVAL_UP_INSERT | DBPROPVAL_UP_DELETE);
   }
};

[!メモ]

ユーザー レコード クラスを変更した場合や独自のコンシューマーを作成した場合は、データ変数をステータスおよび長さの変数より前に記述する必要があります。

デバッグの目的でステータス値を使用できます。ATL OLE DB コンシューマー ウィザードにより生成されたコードで DB_S_ERRORSOCCURREDDB_E_ERRORSOCCURRED などのコンパイル エラーが発生した場合は、フィールド ステータスのデータ メンバーの現在の値を最初に調べます。0 以外の値は、違反する列に対応します。

ステータス値を使用して、特定のフィールドに NULL 値を設定することもできます。これは、フィールド値を 0 ではなく NULL として区別する必要がある場合に役立ちます。NULL が有効値または特殊な値かどうかを決定し、アプリケーションで NULL をどのように処理するかを決定してください。OLE DB は、汎用的な NULL 値を指定する適切な手段として DBSTATUS_S_ISNULL を定義します。コンシューマーがデータを読み込み、その値が null の場合は、ステータス フィールドが DBSTATUS_S_ISNULL に設定されます。コンシューマーが NULL 値を設定する必要がある場合、コンシューマーはプロバイダーを呼び出す前にステータス値を DBSTATUS_S_ISNULL に設定します。

次に、Oledb.h を開いて DBSTATUSENUM を検索します。その後、0 以外のステータスの数値を DBSTATUSENUM 列挙値と比較します。列挙名だけでは問題が判別できない場合は、『OLE DB Programmer's Guide (OLE DB プログラマーズ ガイド)』の「Binding Data Values」セクションにある「Status」を参照してください。このトピックには、データを取得または設定するときに使用されるステータス値の表があります。長さの値については、同じセクションの「Length」を参照してください。

列の長さまたはステータスの取得

可変長の列の長さまたは列のステータスは、たとえば DBSTATUS_S_ISNULL をチェックするために取得できます。

  • 長さを取得するには、COLUMN_ENTRY_LENGTH マクロを使用します。

  • ステータスを取得するには、COLUMN_ENTRY_STATUS マクロを使用します。

  • 長さとステータスの両方を取得するには、次に示すように COLUMN_ENTRY_LENGTH_STATUS を使用します。

class CProducts
{
public:
   char      szName[40];
   long      nNameLength;
   DBSTATUS   nNameStatus;

BEGIN_COLUMN_MAP(CProducts)
// Bind the column to CProducts.m_ProductName.
// nOrdinal is zero-based, so the column number of m_ProductName is 1.
   COLUMN_ENTRY_LENGTH_STATUS(1, szName, nNameLength, nNameStatus)
END_COLUMN_MAP()
};

CTable<CAccessor<CProducts > > product;

product.Open(session, "Product");
while (product.MoveNext() == S_OK)
{
   // Check the product name isn't NULL before tracing it
   if (product.nNameStatus == DBSTATUS_S_OK)
      ATLTRACE("%s is %d characters\n", szName, nNameLength);
}

CDynamicAccessor を使用すると、長さとステータスが自動的に連結されます。長さおよびステータスの値を取得するには、GetLength メンバー関数と GetStatus メンバー関数を使用します。

参照

関連項目

OLE DB コンシューマー テンプレートの操作