Поделиться через


Статус поля элементов данных в мастере создания методов доступа

При использовании мастера потребителей ATL OLE DB для создания потребителя мастер создает член данных в классе записи пользователя для каждого поля, указанного в сопоставлении столбцов. Каждый член данных принадлежит типу DWORD и содержит значение состояния, отвечающее соответствующему полю.

Например, для члена данных m_OwnerID мастер создает дополнительный член данных для состояния поля (dwOwnerIDStatus), а также член для длины поля (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_ERRORSOCCURRED или DB_E_ERRORSOCCURRED, в первую очередь необходимо просмотреть текущие значения членов данных состояния поля. Значения, отличные от нуля, соответствуют столбцам, вызывающим ошибки.

Также значения состояния могут использоваться с целью установки для определенного поля значения NULL. Это может пригодиться при проведении различия между значением поля NULL и нулевым значением. Разработчик может сам решить, является ли значение NULL допустимым или особым значением, а также выбрать способ его обработки. OLE DB определяет DBSTATUS_S_ISNULL как подходящий способ указания универсального значения NULL. Если при считывании данных потребителем задано значение NULL, для поля состояния устанавливается значение DBSTATUS_S_ISNULL. Если необходимо установить значение NULL, потребитель задает значение состояния DBSTATUS_S_ISNULL перед вызовом поставщика.

Затем необходимо открыть файл Oledb.h и найти DBSTATUSENUM. После этого можно противопоставить числовые значения состояния, отличные от нуля, и значения перечисления DBSTATUSENUM. Если имя перечисления недостаточно, чтобы указать, что неправильно, см. в подразделе «состояние» в разделе «значений привязки данных» Руководство программиста OLE DB. В этом подразделе содержатся таблицы значений состояния, используемые при получении или настройке данных. Информацию о значениях длины см. в подразделе "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