Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кожин / Лекции / Лекция 12 ODBC.doc
Скачиваний:
38
Добавлен:
20.03.2016
Размер:
693.25 Кб
Скачать
      1. Получение информации о результате запроса

Определить количество столбцов полученных в результате запроса можно с помощью функции GetODBCFieldCount:

short nFields = cr.GetODBCFieldCount();

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

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 говорит о типе данных в данной колонке. Вот описание типов (перечислены не все возможные типы).

#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

Пример:

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.

      1. Записи в cRecordset

Получить само содержание столбца и текущей строки можно с помощью функции GetFieldValue, в которую передается два параметра: номер столбца и переменная типа CDBVariant для помещения значений:

void CDatebaseDlg::OnOpen()

{

CRecordset cr(NULL);

try

{

cr.Open(CRecordset::snapshot, "SELECT Family,Count FROM TABLE1",

CRecordset::readOnly );

CDBVariant var;

short index=0;

cr.Move(0);

while (!cr.IsEOF())

{ cr.GetFieldValue(index,var);

AfxMessageBox(*var.m_pstring);

cr.MoveNext();

}

cr.Close();

}

catch(CDBException cdb)

{

AfxMessageBox(cdb.m_strStateNativeOrigin);

}

}

Переменная типа CDBVariant принимает значение поля и может принять любое значение. Описание этой переменной (это класс, а не переменная)

m_dwType, m_boolVal, m_chVal, m_iVal, m_lVal, m_fltVal, m_dblVal, m_pdate, m_pstring, m_pbinary.

Конструктор этого класса не имеет параметров.

Функция GetFieldValue данные из указанного столбца в переменную. Эта функция перегруженная и может иметь несколько возможных параметров.

void GetFieldValue( short nIndex, CDBVariant& varValue,

short nFieldType = DEFAULT_FIELD_TYPE );

throw( CDBException, CMemoryException );

      1. Перемещения по записям

Команда Move перемещает указатель на заданную позицию. 0 в первую позицию. После этого задаю цикл, проверяя с помощью IsEOF достижение конца выборки (источника строк).

Для того, чтобы показать все записи я использую функцию MoveNext, которая перемещает меня на следующую запись, и так до достижения окончания записей, которые тестируются функцией IsEOF.

Соседние файлы в папке Лекции