Форум программистов CodeGuru
16 Январь 2018, 22:54:30 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.

Войти
Новости:
 
   Начало   Помощь Войти Регистрация  
Страниц: [1]   Вниз
  Печать  
Автор Тема: Указатель на поле  (Прочитано 17056 раз)
0 Пользователей и 1 Гость смотрят эту тему.
InIn
Пользователь
***
Офлайн Офлайн

Сообщений: 52


Просмотр профиля
« : 30 Август 2006, 17:08:23 »

Привет!

Из MSDN:
if ( !rs.IsFieldNull( pField ) )

Как в реальной проге организовать pField, если работать с DAO в VC++6.0?
Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #1 : 30 Август 2006, 22:34:35 »

Это указатель на данные поля.
В IsFieldNull передается указатель на void (см. прототип):
Код:
BOOL IsFieldNull(
  void* pv
);


Там когда вызываются RFX_* функции для получения данных, надо в них передавать указатели на данные. Вот эти же указатели надо передавать и в IsFieldNull. Вроде так.
но в MSDN же указан пример более эффективного кода для получения данных:
Код:
COleVariant varValue;
int nField = ...номер поля...;

rs.GetFieldValue( nField, varValue );
if ( varValue.vt == VT_NULL )
   // do something
Записан

InIn
Пользователь
***
Офлайн Офлайн

Сообщений: 52


Просмотр профиля
« Ответ #2 : 31 Август 2006, 08:15:50 »

Цитировать
Там когда вызываются RFX_* функции для получения данных, надо в них передавать указатели на данные. Вот эти же указатели надо передавать и в IsFieldNull.


Как передать указатели на эти данные...извините за тупость. А второй пример мне не подходит. Я его знаю.

С уважением, InIn!
« Последнее редактирование: 31 Август 2006, 08:20:20 от inin » Записан
3V
Администратор
Ветеран
*****
Офлайн Офлайн

Сообщений: 1347



Просмотр профиля WWW
« Ответ #3 : 01 Сентябрь 2006, 22:20:07 »

Сорри, в предыдущем посте вообще то указал на функции RFX_*, а это - для класса рекордсета, работающего через ODBC - CRecordset.
Там как и с CDaoRecordset - делается класс, производный от CDaoRecordset.
В этом классе создаются переменные-члены, указатели на данные.
В классе рекордсета создается виртуальная функция DoFieldExchange, в которой вызываются RFX-функции:
Код:
void CCustSet::DoFieldExchange(CFieldExchange* pFX)
{
  //{{AFX_FIELD_MAP(CCustSet)
  pFX->SetFieldType(CFieldExchange::outputColumn);
  RFX_Text(pFX, "Name", m_strName);
  RFX_Int(pFX, "Age", m_wAge);
  //}}AFX_FIELD_MAP
}


Только вот есть просто RFX_* функции - в них передаются ссылки на данные (как в примере выше), а есть RFX_*_Bulk - функции - в них передаются указатели на данные.

Код:
class MultiRowSet : public CRecordset
{
public:
  // Field/Param Data
     // field data members
     long* m_rgID;
     LPSTR m_rgName;

     // pointers for the lengths
     // of the field data
     long* m_rgIDLengths;
     long* m_rgNameLengths;

     // input parameter data member
     CString m_strNameParam;

  .
  .
  .
}


Код:
MultiRowSet::MultiRowSet( CDatabase* pDB )
  : CRecordset( pDB )
{
  m_rgID = NULL;
  m_rgName = NULL;
  m_rgIDLengths = NULL;
  m_rgNameLengths = NULL;
  m_strNameParam = "";

  m_nFields = 2;
  m_nParams = 1;

  .
  .
  .
}


Код:
void MultiRowSet::DoBulkFieldExchange( CFieldExchange* pFX )
{
  // call the Bulk RFX functions
  // for field data members
  pFX->SetFieldType( CFieldExchange::outputColumn );
  RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                 &m_rgID, &m_rgIDLengths );
  RFX_Text_Bulk( pFX, _T( "[colName]" ),
                 &m_rgName, &m_rgNameLengths, 30 );


  // call the RFX functions for
  // for parameter data members
  pFX->SetFieldType( CFieldExchange::inputParam );
  RFX_Text( pFX, "NameParam", m_strNameParam );
}


Bulk-операции - это для получения/обновления данных "пачкой", то есть по указателям на данные будут лежать массивы переменных. Вот на эти переменные в массивах, думаю, и надо передавать указатель в IsFieldNull.

С CDaoRecordset, похоже, все действия идентичны.
То есть, если смотреть по примеру выше, то после совершения
Код:
  RFX_Long_Bulk( pFX, _T( "[colRecID]" ),
                 &m_rgID, &m_rgIDLengths );

можно проверить IsNull ли поле colRecID в 3-ей по счету записи можно так:
Код:
if(rs.IsFieldNull(&rs.m_rgID[2]))
   ...

Однако, это н еточно.
Я пользовался только CRecordset, и данные получал просто проходя по полям в CDBVariantб кажется.
Записан

InIn
Пользователь
***
Офлайн Офлайн

Сообщений: 52


Просмотр профиля
« Ответ #4 : 11 Сентябрь 2006, 10:54:40 »

Благодарю! Но как получить эти ф-ции *_Bulk? Обычным способом не выходит.
« Последнее редактирование: 25 Сентябрь 2006, 16:30:12 от inin » Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2015, Simple Machines Valid XHTML 1.0! Valid CSS!