C++ C++ C# C# ASP.NET Security ASP.NET Security ASM ASM Скачать Скачать Поиск Поиск Хостинг Хостинг  
  Программа для работы с LPT портом...
Язык: .NET — ©Alexey...
  "ASP.NET Atlas" – AJAX в исполнении Micro...
Язык: .NET — ©legigor@mail.ru...
  "Невытесняющая" Многопоточность...
Язык: C/C++ — ©...
  01.05.2010 — Update World C++: Сборник GPL QT исходников
  15.12.2007 — Весь сайт целиком можно загрузить по ссылкам из раздела Скачать
Хостинг:
Windows 2003, ASP.NET 2.0
бесплатный и от 80 руб./мес


   Отправить письмо
Кулабухов Артем, Беларусь




 161 - Дальше о заполнении списка из БД, связанные таблицы / MFC шаг за шагом / Visual C++

Шаг 161 - Дальше о заполнении списка из БД, связанные таблицы

В реальных проектак конечно все сложнее. Существуют взаимосвязанные таблицы. Только вот на чьи плечи возложить ответственность за взаимосвязь таблиц ??? Microsoft предлагает разделить любую программу логически на 3 слоя.

  1. данные
  2. логика
  3. интерфейс

Правда я нигде не встречал подробного объяснения, что понимается под логикой. Так вот, если у нас две связанные таблицы, то кто будет ответственен за связь ??? БД или приложение ??? Давайте попробуем возложить ответственность на БД. Раз уж она называется Access, что вроде означает "доступ", так пусть и работает :-))) Вот схема данных.

161_1.gif (1447 b)

Мы договаривались, что ответственность за связь возмет БД. Поэтому создадим в БД запрос.

161_2.gif (4413 b)

Имя ему дадим Query1.

Вот пора делать программу. Будет изменять предыдущий проект. Итак, теперь мы будет работать не на основе таблицы, а на основе запроса. Значит надо поменять тип класса.

CDaoQueryDef cf(&cd);
// CDaoTableDef cf(&cd);

Идея простая, с таблицами работают одни классы, а с запросами другие. Но класс CDaoRecordset можно строить и на основе таблицы и на основе запроса. Поэтому всё остается похоже. Только при открытии набора записей нужно указать имя запроса.

if (cd.IsOpen())
{
 cf.Open("Query1");
 if (cd.IsOpen())

Что произойдет при выполнении запроса ??? Две таблицы превратятся в одну. Вот так. Теперь мы можем выводить и фамилию и год.

char buf[256];
COleVariant val;
cr.GetFieldValue("family",val); 
COleVariant valyear;
cr.GetFieldValue("year",valyear);
sprintf(buf,"%s %s",val.bstrVal,valyear.bstrVal);
m_ListBox.AddString(buf);
cr.MoveNext(); 

Давайте запустим и посмотрим как это будет выглядеть.

161_3.gif (2319 b)

Видите фамилия и год рядом, т.е. таблицы слились. Некрасиво скажете Вы. Ну это дело поправимое. Чего хотели того добились !!!


Загрузить проект | | |
Автор Каев Артем.
[AD]