Страница 7 из 17 Изучаем 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. #defineSQL_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. |