Шрифт:
Интервал:
Закладка:
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 года
Александр ШаргинA2 Суть "проблемы" в том, что элемент управления CDateTimeCtrl инкапсулирует одновременно и дату, и время , а не то или другое по отдельности. Как известно, тип данных time_t и класс CTime используют так называемый "UTC-based time" формат и хранят число секунд с ноля часов 1 января 1970 года (с учетом часового пояса). Поэтому при работе с CDateTimeCtrl это следует учитывать и использовать его именно в этом контексте (в "увязке" с датой). То есть, если мы инициируем переменную нулевым значением, то мы и имеем "точку отсчета".
Другой интересный вопрос состоит в том, как эффективно организовать корректировку даты и времени одновременно. К примеру: мы имеем переменную m_Time типа CTime с некоторым значением и хотим дать пользователю возможность изменить и время и дату, используя соответственно два элемента CDateTimeCtrl, чтобы в конечном итоге получить скорректированное значение m_Time. Вариант с созданием двух ассоциированных переменных CTime и последующим отбрасыванием у одной даты, у другой времени, и их сложением не очень красивый. Я решил это таким образом: создал ассоциированные переменные типа CDateTimeCtrl (а не CTime), использовал функцию SetTime(&m_Time) для установки даты и времени в обоих переменных, а потом при изменении любой из них считывал измененное значение функцией GetTime(&m_Time) и тут же корректировал значение "сопряженной" переменной функцией SetTime(&m_Time). Таким образом достаточно просто решилась проблема "синхронизации" изменения даты и времени.
Евгений Шмелев ОБРАТНАЯ СВЯЗЬХотел бы дополнить Ваши материалы по .NET:
В частности, хотел бы указать на ошибки в №20 от 22 октября 2000 г.
Платформа Microsoft.NET не базируется на сервисах COM+, а предлагает совершенно новое, более удобное множество сервисов. Так, вместо DCOM и COM+ Вам предоставляется Microsoft .NET Remoting (http://msdn.microsoft.com/library/default.asp?URL=/library/techart/hawkremoting.htm). Вместо каталога COM+ используется каталог .NET.
Естественно, компоненты .NET совместимы с компонентами COM+, в частности, и те, и другие прозрачно доступны друг другу через соответствующий уровень трансляции (flattened COM).
Компиляция исходного кода возможна не только в IL, но и напрямую в машкод.
Первое преимущество .NET – настоящая объектность, включая наследование. Второе примущество – настоящая компонентная архитектура. Если кто-нибудь знаком с RAD-инструментарием Borland Delphi, то могу лишь сказать, что концепции .NET в области компонентной архитектуры, хранимых компонент и свойств, редакторов компонент и редакторов свойств являются органичным развитием идей, заложенных в Delphi VCL.
Собственно, приглашаю на http://msdn.microsoft.com/net/default.asp
Акжан Абдулин[…] пару слов по поводу темы предыдущей рассылки. Я использую для решения этой проблемы опубликованный на нескольких сайтах класс CInstanceChecker (http://www.naughter.com/sinstance.html, автор P.J. Naughter), который, по-моему, вполне успешно решает все описанные проблемы. В частности, там элегантно решен вопрос блокирования с помощью объекта класса CSingleLock повторно-запущенных копий вплоть до того момента, когда первая копия создаст главное окно для возможности его активизации.
И последнее. Порой не хочется заглядывать в русифицированные группы новостей из-за обилия "крутого профессионального жаргона" и некоторой агрессивности участников. Грустно за родной язык. Эдакое подражание новорусскому стилю: "пальцы веером" :). Кстати, англоязычные группы гораздо более традиционные и терпимые, хотя вопросы там бывают дилетантские, а профессиональный уровень отвечающих при этом очень высокий. В этом смысле эта рассылка приятно выделяется, и особо хочется отметить регулярные статьи Александра Шаргина.
Евгений Шмелев[…] хотелось бы также выразить благодарность Александру Шаргину, автору статьи на тему "отладчик" – несмотря на мной многолетний опыт узрел там несколько "приятных мелочей", проверить которые самому руки не доходили.
B свою очередь могу внести небольшое дополнение: если в окне отладчика Watch на одной из закладок поместить выражение
<variable>=<value#1>
где variable – имя переменной, а value#1 – одно из возможных ее значений, то поместив на второй закладке Watch такую же строку с иным значением переменной, мы получаем очень удобный вариант быстрой установки/переключения значений интересующей нас переменной. чаще всего таковыми выступают логические переменные (хотя это и не обчзательно). если же у нас целый набор переменных, значения которых в процессе отладки нужно периодически менять, данный способ будет просто незаменим.
Alexander ZasypkinБлагодарю всех, кто не поленился написать.
В ПОИСКАХ ИСТИНЫQ. 1. Есть окно нестандартной формы (например, круглое). Но рамка, появляющаяся вокруг него при перемещении, – строго прямоугольной формы. Как избавиться от такой рамки вообще? Или, может быть, ее можно сделать тоже произвольной формы (по контуру окна)?
2. Как избавиться от пунктирной рамки на кнопке, имеющей фокус? Для кнопки, сделанной из красивого рисунка, такая рамка выглядит лишней…
Максим ЧучуйкоЭто все на сегодня. Всего вам доброго!
Алекс Jenter [email protected] Красноярск, 2000.Программирование на Visual C++
Выпуск №28 от 17 декабря 2000 г.
Всем привет!
Сегодня вас ждет сюрприз. Сегодня в рассылке впервые появится статья по COM. Мне приходило очень много просьб по этому поводу, часто выражалось недовольство тем, что слишком много внимания уделяется MFC. Типичный пример – в рубрике "Обратная связь". Так что по зрелом размышлении я решил начать понемногу освещать в рассылке и тему COM. В связи с этим, тем кто никогда раньше с COM не сталкивался (а думаю среди подписчиков такие есть), предлагаю вам прочитать статью, знакомящую вас с этой технологией.
СТАТЬЯ
Введение в COM
Часть 1
Автор: michael dunn
Перевод: Илья Простакишин
Источник: The Code Project
Предмет данной статьиЯ написал это руководство для программистов, которые начинают осваивать COM и нуждаются в помощи для понимания основ этой концепции. Статья содержит краткое введение в спецификацию COM, объясняет основные термины и описывает примеры использования существующих компонентов COM. Прошу обратить внимание, что эта статья не научит вас тому, как писать собственные объекты и интерфейсы.
- Программирование - Ирина Козлова - Программирование
- Программирование — вторая грамотность - Андрей Ершов - Программирование
- 97 этюдов для архитекторов программных систем - Нил Форд - Программирование
- Платформа J2Me - Автор неизвестен - Программирование