Все необходимое для соединения с БД и получения набора записей можно реализовать в функции OnNewDocument класса документа.
(АВ: Напомню эта функция в классе документа была создана автоматич в момент создания нами оболочки приложения типа Single Document и выбора CFormView в качестве базового класса нашего приложения. Мы наполним эту функцию новым содержанием. Эта очень важная функция в нашем приложении служит для соединения с БД и получения данных)
До того как реализовать эти возможности, следует добавить несколько переменных в класс документа:
- указатель m_ptrRs
на объект RecordSet, (этим объектом является массив записей)
- указатель m_piAdoRecordBinding
на интерфейс IADORecordBinding
и пару строковых переменных:
- строковую переменную m_strConnection
для хранения строки соединения с БД
- строковую переменную m_strCmdText
для команды SQL, выполнение которой необходимо для получения данных.
Добавьте эти переменные в класс документа;их свойства указаны в таб 13.23
Таб13.23 Переменные класса документа
Имя | Тип | Модификатор доступа |
m_ptrRs | _RecordsetPtr | Private |
m_piAdoRecordBinding | IADORecordBinding* | Private |
m_strConnection | CString | Private |
m_strCmdText | CString | Private |
Вверх
Листинг 13.4 Функция OnNewDocument()
// (SDI documents will reuse this document)
// Инициализировать нулем указатеь на набор(массив) данных и указатель на интерфейс IADORecordBinding
// инициализировать среду модели компонентных объектов MicroSoft (COM)
// открыть набор(массив) объектов
// связать экземпляр класса записи m_rsRecSet с набором(массивом) записей
// получить указатель на вид
return TRUE;
Анализ:
Функция OnNewDocument выполняет ряд шагов для соединения с БД и
получения набора записей:
// Инициализировать объект Recordset и связанные с ним указатели
// Инициализировать среду COM(модели компонентных объектов)
try
{
// связать экземпляр класса хранения данных с набором записей
if (pView)
АВ:
АВ:Полагаю что после вызова рассмотренной здесь функции OnNewDocument() все поля выведенной
на экран записи будут чистыми (не заполненными). Ведь это будет новый
набор записей, не так ли? Нет! Все поля созданной нами формы приложения будут заполнены данными из первоначальной записи БД. А мы предположили, и на практике так сделали, что наша база данных уже инициализирована (заполнена) данными.
Ответ:
Это функции класса CDocument - родительского класса документа CAdoDatabaseDoc
:
Ну это же очевидно! Функции еще какого же класса можно так запросто вызывать?
Конечно, функции родительского класса.
m_strConnection = _T("Provider=MSDASQL.1;Data Source=STYVCDB");
Если вы намерены работать с БД SQL Server 2000, вам следует использовать
драйвер доступа SQLOLEDB.
Вверх
Листинг 13.5 Функция DeleteContents()
// Мы имеем допустимый указатель на Интерфейс IAdoRecordBinding?
// Обнулить указатель
// Закрыть среду модели COM-объектов
АВ: Разумеется функция, которая корректно закрывает все ранее установленные связи
с БД необходима!
Назад |
Начало урока |
Вверх |
Вперед
BOOL CAdoDatabaseDoc::OnNewDocument()
{
return FALSE;
// Установить строку соединения с БД и строку команды SQL
m_strConnection = _T("Provider=MSDASQL.1;Data Source=STYVCDB");
m_strCmdText = _T("select * from Addresses");
m_ptrRs = NULL;
m_piAdoRecordBinding = NULL;
::CoInitialize(NULL);
try
{
m_ptrRs.CreateInstance(__uuidof(Recordset));
m_ptrRs->Open((LPCTSTR)m_strCmdText, (LPCTSTR)m_strConnection,
if (FAILED(m_ptrRs->QueryInterface(__uuidof(IADORecordBinding),
m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet);
POSITION pos = GetFirstViewPosition();
CAdoDatabaseView* pView = (CAdoDatabaseView*)GetNextView(pos);
if (pView)
// вывести на экран значений полей записи
pView->RefreshBoundData();
// Any errors?
catch (_com_error &e)
{
GenerateError(e.Error(), e.Description());
m_strConnection = _T("Provider=MSDASQL.1;Data Source=STYVCDB");
m_strCmdText = _T("select * from Addresses");
m_ptrRs = NULL;
m_piAdoRecordBinding = NULL;
::CoInitialize(NULL);
try
{
m_ptrRs.CreateInstance(__uuidof(Recordset));
// открыть объект Recordset (набор записей)
m_ptrRs->Open((LPCTSTR)m_strCmdText, (LPCTSTR)m_strConnection,
// получить указатель на интерфейс IADORecordBinding , используемый для обмена данными
if (FAILED(m_ptrRs->QueryInterface(__uuidof(IADORecordBinding),
m_piAdoRecordBinding->BindToRecordset(&m_rsRecSet);
// получить указатель на представление
POSITION pos = GetFirstViewPosition();
CAdoDatabaseView* pView = (CAdoDatabaseView*)GetNextView(pos);
// Синхронизировать набор данных с формой
pView->RefreshBoundData();
Характерная последовательность вызова функций для связи класса документа с классом вида:
pos = GetFirstViewPosition();
pView = GetNextView(pos);
pView->RefreshBoundData();
АВ:Вопрос:
Функциями какого класса являются использованные здесь функции
для получения указателя не вид
GetFirstViewPosition() и GetNextView(pos)?
Функции для получения указателя на вид едва ли могут находиться внутри
класса вида!?Значит это функции какого то другого класса.Какого?
virtual POSITION GetFirstViewPosition() const;
virtual CView* GetNextView(POSITION& rPosition) const;
Информацию о драйверах доступа для других БД
можно найти в документации по этим базам.
Функция DeleteContents
Прежде чем мы продолжим, убедитесь что в приложение добавлен весь необходимый
для корректного завершения приложения код. Приложение должно закрыть набор
записей и освободить указатель на интерфейс, используемый для обмена
данными. Кроме того следует очистить среду (COM).
Чтобы добавить эту возможность выполните следующее:
void CAdoDatabaseDoc::DeleteContents()
{
if (m_ptrRs)
if (m_piAdoRecordBinding)
m_piAdoRecordBinding->Release();
m_ptrRs = NULL;
CoUninitialize();
CDocument::DeleteContents();
Содержание