
- •Работа с базой данных через odbc.
- •Общий обзор odbc
- •Хранение настроек об источнике данных odbc
- •Утилита администрирования
- •Реестр операционной системы
- •Функция sqlConfigDataSource()
- •Класс cDatabase
- •Установка соединения
- •Настройка файлового соединения
- •Настройка пользовательского соединения
- •Пример приложения для работы с бд
- •Функции IsOpen
- •Открытие набора записей
- •Получение информации о результате запроса
- •Записи в cRecordset
- •Перемещения по записям
- •Фильтры, сортировка cRecordset
- •Обмен данными с таблицей
- •Добавления новой записи в Базу данных.
- •Редактирование записей
- •Удаление записей
- •Поддержка транзакций
- •Настройка odbc и текущий каталог
- •Выполнение функций odbc api из класса cDatabase
Получение информации о результате запроса
Определить количество столбцов полученных в результате запроса можно с помощью функции 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.
Записи в 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 );
Перемещения по записям
Команда Move перемещает указатель на заданную позицию. 0 в первую позицию. После этого задаю цикл, проверяя с помощью IsEOF достижение конца выборки (источника строк).
Для того, чтобы показать все записи я использую функцию MoveNext, которая перемещает меня на следующую запись, и так до достижения окончания записей, которые тестируются функцией IsEOF.