Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
кожин / Лекции / Лекция 12 ODBC.doc
Скачиваний:
39
Добавлен:
20.03.2016
Размер:
693.25 Кб
Скачать
    1. Фильтры, сортировка 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);

}

}

    1. Обмен данными с таблицей

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 );

    1. Добавления новой записи в Базу данных.

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.

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