Модификация данных в таблице
С помощью методов класса CRecordset можно изменять записи в таблице и добавлять новые записи. Прежде чем изменять запись, следует убедиться, что открытое множество записей допускает такую операцию, с помощью функции CRecordset::CanUpdate. Сама модификация начинается вызовом функции CRecordset::Edit и завершается вызовом функции CRecordset::Update; между этими двумя вызовами следует изменить значения переменных, связанных с полями множества записей. Например:
if (Rs.CanUpdate) {
Rs.Edit;
Rs.Rs.m_Name = "Vasya Pupkin";
Rs.m_DateOfBirth = CTime(2000, 1, 1, 0, 0, 0);
Rs.Update;
}
Аналогичным образом можно добавлять новые записи, но вместо Edit используется AddNew. Убедиться в том, что множество записей поддерживает добавление, можно с помощью функции CRecordset::CanAppend. Например:
if (Rs.CanAppend) {
Rs.AddNew;
Rs.Rs.m_Name = "Vasya Pupkin";
Rs.m_DateOfBirth = CTime(2000, 1, 1, 0, 0, 0);
Rs.Update;
}
И последнее замечание. Чтобы обновить множество записей после внесения изменений в БД, нужно вызвать функцию CRecordset::Requery.
Разрыв соединения
Это самый простой, но совершенно необходимый этап. Закончив работу с источником данных, программа должна разорвать с ним соединение вызовом CDatabase::Close. Перед этим необходимо также закрыть все наборы записей, используя функцию CRecordset::Close. Ни одна из этих функций не принимает никаких параметров.
Если у вас есть какие-либо вопросы, предложения или пожелания, присылайте их мне по адресу [email protected]. Я постараюсь учесть их при написании второй части статьи, которая будет посвящена более сложным аспектам работы с ODBC.
Q Есть диалог на нем Date Time Picker и есть соответствующая ему переменная m_Time типа CTime. Проблема в том, что если m_Time = 0, то в диалоге высвечивается 2:00:00!!?? Т.е. сдвиг на два часа. Причем если выставить 0:00:00, то будет "Assertion fault". Ну и соответственно, если установить 2:00:00, то после UpdateData m_Time станет = 0. Скорее всего это как-то связано с часовым поясом (у меня часовой пояс +02:00). Как от этого избавиться?
A1 Как известно, класс CTime – это всего лишь объектная обёртка вокруг типа _t из стандартной библиотеки языка C. А тип time_t (4 байта) хранит время как число секунд, прошедших с момента полуночи 1 января 1970 года. Это означает, что класс CTime не может хранить время ДО этого момента. А если записать в него 0, мы как раз и получим 1.01.1970, 0:00:00 (или 2:00:00 с учётом часового пояса).
Когда Date Time Picker работает в режиме ввода времени, он всё равно "помнит" полную дату. Если ввести в него "0:00:00", то с учётом часового пояса получится 31.12.1969, 22:00:00, то есть дата за пределами диапазона допустимых значений CTime. Это и приводит к срабатыванию ASSERT'а.
А для решения проблемы достаточно записать в CTime какую-нибудь дату, отличную от 1.01.1970. Например:
m_Time = CTime(2000, 1, 1, 0, 0, 0); // 1 января 2000 года