Создание приложения ODBC
Реферат - Компьютеры, программирование
Другие рефераты по предмету Компьютеры, программирование
чтобы сразу перейти к шаблону созданной функции, куда потребуется добавить код, приведенный ниже. Просмотрите примечание, расположенное после текста кода.
void CPrimView::OnRecordAppend()
{
// TODO: Add your command handler code here
//Сначала проверяем, не была ли открыта база данных
// в режиме только для чтения. Если это так,
//то выводим предупреждение и выходим из функции
if(m_pSet->CanAppend() == 0)
MessageBox("Можно только просматривать записи ",
" Ошибка добавления записи ",
MB_OK | MB_ICONWARNING);
else
{
// Перемещаемся на первую запись
m_pSet->MoveFirst();
// Создаем пустую запись,
// в которую пользователь будет вводить значения
m_pSet->AddNew();
// Устанавливаем флаг перехода в режим добавления записи
m_bAdd = TRUE;
// Обновляем поля формы
UpdateData(FALSE);
}
}
Рис. 15. Диалоговое окно MFC ClassWizard после проведенных действий
Примечание:
Для успешной работы приложения необходимо ввести новую переменную для фиксации режима добавления записи m_bAdd:
- В окне Class View щелкните правой кнопкой на имени класса CPrimView и выберите в появившемся контекстном меню команду Add>Add Variable. Появится диалоговое окно Add Member Variable Wizard.
- В раскрывающемся списке Access выделите метод доступа protected, в текстовом поле раскрывающегося списка Variable type сохраните тип переменной bool, в текстовом поле Variable name введите идентификатор переменной m_bAdd и нажмите кнопку Finish.
- Проинициализируем добавленную переменную значением FALSE для нормальной работы в режиме просмотра записей.
CPrimView>CPrimView()
Вставьте код:
CDBView::CDBView() : CRecordView(CDBView::IDD)
{
m_bAdd = FALSE;
}
Рассмотрим, как работает функция OnRecordAppend. Прежде всего она проверяет, можно ли добавлять данные в базу данных. Сделать это можно с помощью функции CanAppend класса CRecordset. Если добавлять записи нельзя, то необходимо вывести сообщение об ошибке и завершить работу, что и сделано в нашем примере.
Далее нужно подготовить элементы управления в форме для ввода новых значений. Для этого мы перемещаемся в начало набора записей (функция MoveFirst), вызываем специальную функцию AddNew, подготавливающую результирующий набор к приему новой записи, и устанавливаем флаг, что это новые данные. Осталось только очистить поля элементов управления, что и делает функция UpdateData(FALSE).
Итак, элементы управления в форме и результирующий набор готовы к приему данных. Теперь необходимо решить вопрос, каким образом и где передать введенные в форме значения в результирующий набор. Самым простым представляется способ добавления специальной кнопки, нажатие на которую вызовет специальный обработчик, где введенные значения перепишутся в результирующий набор. Второй способ не требует создания дополнительных элементов управления и для фиксации значений использует переопределенную функцию перемещения по записям результирующего набора Move. (В классе CPrimView выделите в списке функцию OnMove и добавьте заготовку для этой функции). Кроме того, необходимо определить переменную m_bAdd.
BOOL CPrimView::OnMove(UINT nIDMoveCommand)
{
// TODO: Add your specialized code here and/or call the base class
// Проверяем, в каком режиме добавления или перемещения -
// мы находимся
if(m_bAdd) {
// Выходим из режима добавления
m_bAdd=false;
UpdateData();
if (m_pSet->CanUpdate() )
m_pSet->Update() ;
m_pSet->Requery();
UpdateData(FALSE);
return TRUE;
}
else
// Переходим к следующей записи в результирующем наборе
return CRecordView::OnMove(nIDMoveCommand);
}
Рассмотрим логику работы функции OnMove. Если мы попали в нее после ввода новой записи (установлен флаг m_bAdd), то переписываем введенные значения в базу данных. В противном случае просто переходим к следующей записи. Нас, естественно, интересует режим добавления. Прежде всего необходимо прочитать данные из элементов управления формы. Обратите внимание, что переменные класса CDBView определены так, что мы это делаем непосредственно в результирующий набор, используя функции обмена полями данных, например, для поля IDC_PROD.
DDX_FieldText(pDX, IDC_PROD, m_pSet->m_ProductName, m_pSet);
Если никакой ошибки не произошло, то перечитаем информацию из базы данных, чтобы работать с самым последним набором. Теперь осталось только обновить элементы управления в форме. Помните, в функции OnRecordAppend мы перед входом в режим добавления переместились на первую запись результирующего набора. Поэтому необходимо вызвать функцию UpdateData(FALSE), чтобы отобразить ее в элементах управления формы. И, наконец, не забываем сбросить флаг m_bAdd, чтобы избежать ошибок.
Вернемся к табл.1, где представлены поля таблицы jobs. Видим, что у столбца job_id установлен тип данных IDENTITY. Это означает, что система управления базами данных сама позаботится о присвоении значения этому столбцу. Чтобы решить эту проблему достаточно поменять переменную, с которой связан элемент управления IDC_EDIT4 (например, на m_job_Nom типа long), и тем самым переложить задачу на СУБД.
Кроме этого, в код требуется также добавить одну строку, чтобы можно было видеть информацию об идентификаторе job_id.
void CPrimView::DoDataExchange(CDataExchange* pDX)
{// Для отображения значений поля job_id таблицы