
- •Работа с базой данных через odbc.
- •Общий обзор odbc
- •Хранение настроек об источнике данных odbc
- •Утилита администрирования
- •Реестр операционной системы
- •Функция sqlConfigDataSource()
- •Класс cDatabase
- •Установка соединения
- •Настройка файлового соединения
- •Настройка пользовательского соединения
- •Пример приложения для работы с бд
- •Функции IsOpen
- •Открытие набора записей
- •Получение информации о результате запроса
- •Записи в cRecordset
- •Перемещения по записям
- •Фильтры, сортировка cRecordset
- •Обмен данными с таблицей
- •Добавления новой записи в Базу данных.
- •Редактирование записей
- •Удаление записей
- •Поддержка транзакций
- •Настройка odbc и текущий каталог
- •Выполнение функций odbc api из класса cDatabase
Фильтры, сортировка cRecordset
Если тщательно разобраться с SQL оператором SELECT, то с помощью него можно получить практически любые виды от исходной таблицы. Но этот способ не единственный. Даже если с помощью оператора SQL записи отсортированы, всегда возникает необходимость допустим их отсортировать по полю или наложить фильтр. Это можно сделать и на основе доступных переменных класса CRecordset.
Для накладывания фильтра в классе CRecordset есть переменная m_strFilter. В эту переменную можно поместить фильтр и вызвать функцию обновления источника строк.
void CDatebaseDlg::OnOpen()
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::dynaset, "SELECT * FROM TABLE1");
cr.m_strFilter ="Count<100";
cr.Requery();
CDBVariant var;
short index=1;
cr.Move(0);
cr.GetFieldValue(index,var);
AfxMessageBox(*var.m_pstring);
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}
Dynaset позволяет создавать динамические запросы.
После задания фильтра функция Requery, обновит источник строк на основе фильтра.
Для сортировки тоже есть переменная m_strSort, в ней можно указать поле, по которому будет произведена сортировка.
void CDatebaseDlg::OnOpen()
{
CRecordset cr(NULL);
try
{
cr.Open(CRecordset::dynaset, "SELECT * FROM TABLE1");
cr.m_strSort="Family";
cr.Requery();
CDBVariant var;
short index=1;
cr.Move(0);
cr.GetFieldValue(index,var);
AfxMessageBox(*var.m_pstring);
cr.Close();
}
catch(CDBException cdb)
{
AfxMessageBox(cdb.m_strStateNativeOrigin);
}
}
Обмен данными с таблицей
RFX - Record Field Exchange. Это механизм обмена данными между классом потомком от CRecordset и самой базой данных. Работа этого механизма по смыслу аналогична работе DDX. Данный механизм применяет ClassWizard при автоматическом создании класса CRecordset.
Для работы с RFX необходимо создать потомка от класса CRecordset на основе известной структуры базы данных.
class MyCrec:public CRecordset
{
public:
MyCrec( CDatabase* pDatabase = NULL);
virtual void DoFieldExchange(CFieldExchange* pFX);
CString m_Fam;
};
Простое наследование, перегрузка конструктора, объявление функции DoFieldExchange для организации механизма обмена и переменной типа CString для соответствия формату поля колонки из таблицы базы данных.
MyCrec::MyCrec( CDatabase* pDatabase)
:CRecordset(pDatabase)
{
}
Функция обмена:
void MyCrec::DoFieldExchange(CFieldExchange* pFX)
{
pFX->SetFieldType(CFieldExchange::outputColumn);
RFX_Text(pFX,_T("Famili"),m_Fam);
}
В простом приближении правило простое. Перед функциями обмена надо вызвать SetFieldType.
Эта функция позволяет произвести обмен между переменной типа CString и текущей строкой в конкретной колонке базы данных.
void RFX_Text( CFieldExchange* pFX, const char* szName,
CString& value, int nMaxLength = 255,
int nColumnType = SQL_VARCHAR,
short nScale = 0 );
Добавления новой записи в Базу данных.
void CDatebaseDlg::OnOpen()
{
MyCrec cr(NULL);
try
{
cr.m_nFields=1;
cr.Open(CRecordset::dynaset, "SELECT * FROM TABLE1");
if(cr.CanAppend()) cr.AddNew();
cr.m_Fam="Иванов";
cr.Update();
cr.Close();
}
catch(CDBException db)
{
AfxMessageBox(db.m_strStateNativeOrigin);
}
}
Итак, объявляем объект от нашего класса. Устанавливаем количество колонок в m_nFields. Открываем набор записей, как динамический (т.е. в который можно вносить измения) - dynaset. CanAppend проверяет возможность добавления записей. Запись добавляется пустая. Вводим в переменную содержание и заносим данные непосредственно в базу данных Update.