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 руб./мес


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




 Динамическая фильтрация данных при работе с БД / Базы данных / Visual C++

 Динамическая фильтрация данных при работе с БД
     с использованием ADO.
      Использование ODBC, SQL, DataCrid  Control,ADO
      в Visual C++ 6.0 для динамической фильтрации записей БД.

           В данной статье я не буду расказывать как создавать саму базу данных, это Вы
сможете, я надеюсь, сделать сами. В данном примере база данных (БД) создавалась в
MS Access .Что немаловажно, данный пример расчитан на любую БД, с любым
количеством полей,

  База данных и ODBC.
                В двух словах, база данных размещена в файле с именем DB1в этой базе данных
помещены две таблицы: одна из них называется "operations" и содержит операции
которые могут иметь место. Как  связывать базу данных в ODBC подробно рассказано
в статье №3. Здесь только скажем, что источник ODBC мы назвали "data12".

  Что касается Visual C++ 6.0 .
   * Что касательно Visual C++ то нам надо создать каркас приложения с
помошью MFC AppWizrd (exe)указав, что мы создаем Диалоговое приложение .
   * Далее необходимо перейти к редактору диалоговых окон и поместить в
диалог один ActiveX компонент: Microsoft Data Grid Control.
Для этого необходимо выбрать командуProject (проект) / Add To Project
(добавить в проект)  / Components and Controls (компоненты и элементыуправления )
/ Register ActiveX Controls (зарегистрированные элементы ActiveX) .
   * Из списка компонентов выбрать Microsoft Data Grid Control. как показано ниже и нажав
кнопку Insert. подтвердить вставку указанного элемента.

   * После этого в панели инструментов появятся значки для внедренного в проект.
 Далее этот элемент и три кнопки  необходимо поместить на поле диалога там где
Вам надо,и так как Вам надо. Можно и растянуть как само диалоговое окно так и
элементы только что вставленные.
* Кнопка Load Data Base загружает соединение с ODBC источником и выводит
   содержимое базы данных в Data Grid Control.
* Кнопка Show Remunerated  фильтрует данные.
* Кнопка Reset Filter сбрасывает условия фильтрации. Т.е возвращает отображение
            БД в исходное состояние.

   * Далее нам необходимо настроить параметры элемента Microsoft Data Grid Control
Щелкнув правой кнопкой мыши на объекте  Microsoft Data Grid Control перейдем к
редактированию его свойств.Во вкладке Control выберем фишками возможность добавления
добавления новой записи  и возможность удаления записи. (если надо, конечо)

* Необходимо также определить глобальное имя для нашего объекта
Microsoft Data Grid Control это делается с помощью MFC ClassWizard

 По поводу SQL.
Если Вы в первый раз слышите такое название, или слышите не в первый раз, но
мало представляете что это такое Вам имеет смысл сначала прочитать статью №4.
(это серьезно и важно для понимания следующих далее объяснений)

 Иннициализация ADO.
Самая важная, на мой взгляд, деталь это добавить в проект директиву
        #import
которая подключает к проекту файлы содержащие реализацию классов
и объектов ADO.
Для этого надо в файле StdAfx.h  добавить следующие строчки

#import "c:\program files\common files\system\ado\msado15.dll" \
        no_namespace \
        rename("EOF","ADOEOF")

как показано на рисунке ниже

 Cоздание объекта соединения ADODB::Connection,
        объекта отображения набора записей ADODB::Recordset,
        и связывание DataGrid Control с ADODB::Recordset
Дважды щелкнув на кнопку Load Data Base (на поле редактирования диалога)
перейдем к написанию кода для данного действия. Код приведен ниже

void CC1Dlg::OnButton1()
{
// HRESULT        hr ;          надо объявить в c1Dlg.h в разделе protected
// _RecordsetPtr ebRecS;  надо объявить в c1Dlg.h в разделе protected

try { // Секция попытки иннициализации соединения с БД

  ebRecS.CreateInstance(__uuidof(Recordset)); // Объевление гибкого указателя

//Далее открывается объект отображения набора записей
  ebRecS->Open("select * from operations",        // SQL команда вывода всех записей БД
                              "DSN=data12;UID=;PWD=;",  //ODBC источник данных
                               adOpenStatic,
                               adLockOptimistic,
                               adCmdText);

//Далее связывание DataGrid Control с объектом отображения набора записей
  m_grid.SetRefDataSource((LPUNKNOWN) ebRecS);
  m_grid.Refresh();

}

// Секция обработки ошибок при открытии  соединения с ODBC и БД
catch(_com_error &ce)
 {
  _bstr_t e_Src(ce.Source());            // Источник ошибки
  _bstr_t e_Desc(ce.Description()); // Текст с описанием ошибки

  MessageBox("ОШИБКА:   "+  e_Src +"\n"+"ПРИЧИНА:"+  e_Desc,
        "Ошибка иннициализации БД",
        MB_ICONERROR);
 }

catch(...)    //ошибка нерассмотренного типа
 { MessageBox("все совсем плохо - ошибка неизвестного типа");}

}

 Фильтрация объекта отображения набора записей
        и связывание DataGrid Control с полученным результатом
Дважды щелкнув на кнопку Show Remunerated (на поле редактирования диалога)
перейдем к написанию кода для фильтрации неоплаченых платежей. (Допустим
так надо было мне, но для понятия концепции понятно)
Код приведен ниже

void CC1Dlg::OnButton2()
{

try  // Секция попытки иннициализации соединения с БД
{
 ebRecS->Filter = "oplacheno = NULL";                         // SQL фильтр

//Далее связывание DataGrid Control с объектом отображения набора записей
 m_grid.SetRefDataSource((LPUNKNOWN) ebRecS);
 m_grid.Refresh();
}

// Секция обработки ошибок при фильрации БД
catch(_com_error &ce)
 {
  _bstr_t e_Src(ce.Source());             // Источник ошибки
  _bstr_t e_Desc(ce.Description()); // Текст с описанием ошибки

  MessageBox("ОШИБКА:   "+  e_Src +"\n"+"ПРИЧИНА:"+  e_Desc,
        "Ошибка при фильтрации БД",
        MB_ICONERROR);
 }

catch(...) //ошибка нерассмотренного типа
 { MessageBox("все совсем плохо - ошибка неизвестного типа");}

}

Подробнее о  ebRecS->Filter = "oplacheno = NULL";
    Открывая набор записей ,вы задаете команду или запрос, генерирующий
набор  строк. Вы можете ограничивать это множество запрашиваемых строк,
задав свойство Filter набора записей. Свойство Filter представляет собой
расширение запроса (или имени таблицы, которое генерирует простой
запрос SQL ) заданного в методе Open ( ). Строка ,задаваемая для свойства
Filter , неявно содержит оператор WHERE используемый для ограничения
запроса к источнику данных. Замечу, что строка свойства Filter не должна
содержать ЯВНО оператор WHERE - он подразумевается.
На свойство Filter накладывается существенное ограничение:
в его значении можно использовать лишь те имена столбцов, которые
действительно содержатся в наборе записей. Вот почему в выше приведенной
части кода существует секция обработки ошибкок.

   Отмена условий фильтрация объекта отображения набора
        записей и связывание DataGrid Control с полученным
        результатом

Дважды щелкнув на кнопку Reset Filter (на поле редактирования диалога)
перейдем к написанию кода для отмены фильтрации  платежей.
Код приведен ниже

void CC1Dlg::OnButton3()
{

  ebRecS->Filter = ""; // никаких извращений просто присвоим нулевую строку
  m_grid.SetRefDataSource((LPUNKNOWN) ebRecS);
  m_grid.Refresh();
// и никакой обработки ошибок потому что неуказаны имена столбцов
}
 

 Вместо заключения.
* Вот собственно и все, здесь приведены только концепции остальная работа за
   ВАМИ.
* Настоятельно рекомендую установить себе полный MSDN хоть он и занимает
    два компакта но найти там можно практически всю интересующую информацию.

Пример (правда безсамой базы данных)  можно скачать и посмотреть здесь
Предложу Вашему вниманию еще Майкрософтовский пример в принципе познавательный
Вопросы, просьбы и пожелания отправляйте по адрессу kozloff@dviyka.odessa.net
С ув. и пожеланием успехов Денис Козлов.