Использование ODBC в Visual C++ - Изучаем CRecordset

ОГЛАВЛЕНИЕ

Изучаем CRecordset

Итак, мы можем получить обьект CRecordset, например, как ниже. Теперь пора изучить его свойства. Открытие сильно упрощено.

void CDatebaseDlg::OnOpen() 
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::snapshot,
"SELECT Family,Count FROM TABLE1", CRecordset::readOnly );
//........
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}

Нам может понадобиться SQL, на основе которого создан данный источник строк:

// Описание  const CString& GetSQL( ) const;
//......

cr.Open(CRecordset::snapshot,"SELECT Family,Count FROM TABLE1",CRecordset::readOnly);
AfxMessageBox(cr.GetSQL());
//......

Теперь надо проанализировать сколько столбцов нам вернулось. Вы можете сказать: "ведь мы знаем, что два из запроса SQL", но запрос можно построить и так, что это будет не факт. Смотрите SELECT. Получаем количество столбцов:

// Описание short GetODBCFieldCount( ) const;
short nFields = cr.GetODBCFieldCount();

Используя количество столбцов можно получить о них информацию с помощью GetODBCFieldInfo():

// Описание void GetODBCFieldInfo( short nIndex,
// CODBCFieldInfo& fieldinfo ); throw( CDBException );


short nFields = cr.GetODBCFieldCount();
for (short x=0;x < nFields;x++)
{
CODBCFieldInfo fieldinfo;
short pos=x;
cr.GetODBCFieldInfo(pos,fieldinfo );
AfxMessageBox(fieldinfo.m_strName);
}

Информация о типе полей находится в струтуре CODBCFieldInfo():

struct CODBCFieldInfo
{
CString m_strName;
SWORD m_nSQLType;
UDWORD m_nPrecision;
SWORD m_nScale;
SWORD m_nNullability;
};

Мы воспользовались данными из структуры m_strName. В этом поле структуры находится имя столбца запроса.

Второе поле m_nSQLType говорит нам о типе данных в данной колонке. Вот описание типов. Вы, наверно, заметили, что я перечислил не все возможные типы, например, нет OLE.

#define	SQL_UNKNOWN_TYPE 0
#define SQL_CHAR 1
#define SQL_NUMERIC 2
#define SQL_DECIMAL 3
#define SQL_INTEGER 4
#define SQL_SMALLINT 5
#define SQL_FLOAT 6
#define SQL_REAL 7
#define SQL_DOUBLE 8
#define SQL_DATETIME 9
#define SQL_VARCHAR 12

Пример ниже показывает как этим можно воспользоваться. Он просматривает все колонки в поисках поля типа Integer и при нахождении выдает о нем информацию:

for (short x=0;x < nFields;x++)
{
CODBCFieldInfo fieldinfo;
short pos=x;
cr.GetODBCFieldInfo(pos,fieldinfo );
if (fieldinfo.m_nSQLType==SQL_INTEGER)
AfxMessageBox("integer " + fieldinfo.m_strName);
}

Поле структуры m_nPrecision соотвествует в ACCESS ширине поля. 

Поле Scale говорит о том, сколько знаков после запятой у числового поля, а m_nNullability отвечает за то, может ли это поле принимать NULL. И для этого данное поле необходимо сравнить с SQL_NULLABLE или с SQL_NO_NULLS.