Создание приложения 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:

  1. В окне Class View щелкните правой кнопкой на имени класса CPrimView и выберите в появившемся контекстном меню команду Add>Add Variable. Появится диалоговое окно Add Member Variable Wizard.
  2. В раскрывающемся списке Access выделите метод доступа protected, в текстовом поле раскрывающегося списка Variable type сохраните тип переменной bool, в текстовом поле Variable name введите идентификатор переменной m_bAdd и нажмите кнопку Finish.
  3. Проинициализируем добавленную переменную значением 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 таблицы