Оригинальный DVD-ROM: eXeL@B DVD !
eXeL@B ВИДЕОКУРС !

ВИДЕОКУРС ВЗЛОМ
выпущен 2 августа!


УЗНАТЬ БОЛЬШЕ >>
Домой | Статьи | RAR-cтатьи | FAQ | Форум | Скачать | Видеокурс
Новичку | Ссылки | Программирование | Интервью | Архив | Связь

ПРОГРАММИРОВАНИЕ НА C и С++



Возможности языков семейства Си по истине безграничны, однако, в этой свободе кроются и недостатки: всегда нужно программисту держать ухо востро и контроллировать "переполнение буфера", чтобы потом программа не вылетала в "синий экран" на массе разнообразных версий Windows и железа у пользователей. Те же крэкеры и реверсеры специально ищут в коде программ на Си уязвимости, куда можно подсадить любой вирусный код, об этом более подробно автор рассказывал в своём видеокурсе здесь. Я там многое узнал и теперь мой код стал значительно более безопасный.
 Динамическая фильтрация данных при работе с БД
     с использованием 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
С ув. и пожеланием успехов Денис Козлов.
 
 
 

<< ВЕРНУТЬСЯ В ПОДРАЗДЕЛ

<< ВЕРНУТЬСЯ В ОГЛАВЛЕНИЕ




Материалы находятся на сайте https://exelab.ru/pro/



Оригинальный DVD-ROM: eXeL@B DVD !


Вы находитесь на EXELAB.rU
Проект ReactOS