Архів якісних рефератів

Знайти реферат за назвою:         Розширений пошук

Меню сайту

Головна сторінка » Інформатика, програмування

Microsoft Visual C++ (шпора)

Microsoft Visual C++.

 

1.Призначення классів документа і виду (Visual C++)

Программа, созданная Visual C++ AppWizard, состоит из четырех основных частей: объекта приложения, объекта главного окна, объекта документа и объекта вида.

Объект вида

Объект вида предназначен для работы с клиентской областью — местом, где обычно отображаются в соответствующем формате данные нашей программы (скажем, текст, если вы работаете с текстовым редактором). На самом деле объект вида представляет собой окно, которое накладывается поверх клиентской области. Объект вида отображает данные, хранящиеся в объекте документа.

Объект документа

В объекте документа хранятся данные программы. Дело в том, что данных бывает много, причем не все они отображаются в клиентской области. Visual C++ облегчает нашу задачу и позволяет сохранить все данные в объекте документа, а затем поручить объекту вида отобразить лишь те данные, которые попадают в клиентскую область объекта вида. Так как для одного документа можно иметь несколько одновременно открытых видов.

2. Читання символів з клавіатури.(Visual C++)

void CKeyView::OnChar(UINT nChar, UINT nRepCnt, UINT nFlags)

{

CKeyDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData+=nChar;

Invalidate();

CView::OnChar(nChar, nRepCnt, nFlags);

}

При каждом нажатии клавиши Windows посылает сообщение WM_CHAR, которое мы свяжем с методом 0nChar() объекта вида. Для этого мы воспользуемся Visual C++ Class Wizard.

Добавим новый обработчик сообщений, 0nChar(), в класс вида C(имя вашего класса)View, поэтому убедитесь, что в списке Class name выбран именно он. Нас интересует сообщение Windows WM_CHAR, которое посылается программе при нажатии клавиши пользователем. После того как метод 0nChar() будет связан с сообщением WM_CHAR, он будет вызываться каждый раз, когда пользователь введет символ. Найдите это сообщение в списке Messages и дважды щелкните на нем.

В списке Member functions немедленно появляется метод 0nChar(). ClassWizard пo умолчанию присваивает имя 0nChar() обработчику сообщения WM_CHAR, а обработчик сообщения WM_M0USEM0VE по умолчанию получает имя 0nMouseMove().

Фактическое значение символа передается в параметре nChar. Если пользователь не отпускает клавишу, что приводит к автоматической генерации нажатий, то количество нажатий данной клавиши будет передано в параметре nRepCnt.

3.Обробка подый миши.

void CCaretsView::OnLButtonDown(UINT nFlags, CPoint point)

{

x = point.x;

y = point.y;

CCaretsDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

pDoc->StringData.Empty();

Invalidate();

CView::OnLButtonDown(nFlags, point);

}

Эта функция вызывается нажатием левой кнопки мыши. При этом определяются координаты начала вывода строки StringData и эта строка очищается. После этого вызывается Invalidate() и в функции OnDraw() устанавливается курсор без текста для ввода очередной строки.

Помимо метода OnLButtonDown(), можно использовать и другие методы для работы с мышью — OnLButtonUp(), отвечающий за обработку отпускания левой кнопки мыши, OnRButtonDownO, соответствующий нажатию правой кнопки мыши, OnLButtonDblClick(), обрабатывающий двойной щелчок левой кнопкой, и т. д.

Методу OnLButtonDown() передаются два параметра, nFlags и point. Первый содержит информацию о состоянии различных служебных клавиш. Параметр point, объект класса CPoint, содержит текущие координаты указателя мыши.

4. Сворення меню і кнопок на панелі інструментів.

Добавление кнопок на панель инструментов. Откройте в окне просмотра папку Toolbar и щелкните в строке IDR_MAINFRAME. На панели будет активна пустая кнопка. Графическими средствами на ней можно выполнить любой рисунок. Для привязки новой кнопки и команды меню Demo1 на панели инструментов дважды щелкните на пустой кнопке. В окне свойств Toolbar Button Properties выберите из списка уже созданный идентификатор ID_DEMO_DEMO1. Это обеспечивает связь между командой меню и кнопкой на панели инструментов. Для того чтобы вывести подсказку при подведении мыши к определенной кнопке на панели инструментов в поле Prompt можно ввести текст «Demo1\nDemo1». Это означает, что текст «Demo1» будет не только в строке состояния (нижняя часть экрана), а также будет подсказка, при подведении курсора мыши к кнопке панели инструментов. Это обеспечивает разделитель строки «\n».

5. Створення діалогових вікон.

Чтобы создать диалоговое окно, выполните команду Inserts Resource в Visual C++. Появляется окно Insert Resource. Выделите в списке строку Dialog и нажмите кнопку New.

Кнопка New запускает редактор диалоговых окон. В редакторе уже присутствует «заготовка» для создаваемого окна. Диалоговые окна, как и меню, относятся к «ресурсам» Windows-программ. Пускай, нашему диалоговому окну присвоен идентификатор ID_DIHALOGl. В нем уже размещены две кнопки — ОК и Cancel. Они присутствуют почти во всех диалоговых окнах; кнопка ОК подтверждает предыдущие действия пользователя, а кнопка Cancel отменяет их. Если пользователь закрывает диалоговое окно кнопкой ОК, метод DoModal() возвращает значение ID_0K, а при закрытии окна кнопкой Cancel DoModal возвращает ID_CANCEL. В правой части видна палитра с инструментами редактора диалоговых окон. Ею можно воспользоваться, чтобы добавить в диалоговое окно дополнительные управляющие элементы.

Также можно создать диалоговое окно, при создании программного кода, то есть сделать вашу программу на основе диалогбасед.

6. Особливості обміну даних між діалогом та головним классом.

Передача данных в диалог может осуществляться в его конструкторе. Целесообразно передавать данные в виде указателей в диалог. В диалоге они будут определены и возвращены по адресу. Также можно использовать структуры, содержащие несколько переменных и передавать их в диалог.


 

7. Робота з кнопками і текстовими полями в діалоговому вікні.

Существует общий способ работы с управляющими элементами — можно присвоить имя всему элементу и работать с соответствующим объектом, а не с отдельным свойством элемента. Давайте посмотрим, как это делается.

Запустите ClassWizard и перейдите на вкладку Member Variables, затем выберите из списка Control_ID строку IDC_EDIT1. Нажмите на кнопку Add Variable, и откроется окно Add Member Variable.

Мы присвоим объекту текстового поля имя m_edit. Введите в поле Member variable name строку m_edit; убедитесь, что в списке Category выбран пункт Control, а в списке Variable — CEdit; нажмите кнопку ОК. Появляется новая переменная m_edit. Теперь у нас есть объект для работы с текстовым полем в диалоговом окне. Мы можем работать с ним напрямую и пользоваться всеми его методами.

9. Робота із списками в діалоговому вікні.

1. Разместим в диалоговом окне элемент управления ListBox, а также текстовое поле. Затем свяжем со списком объект класса CListBox по идентификатору IDC_LIST1. Имя переменной типа CListBox mlist. Кроме этого свяжем переменную m_text типа CString с текстовым полем (IDC_EDIT1).

2. Для выбора строки из списка двойным щелчком создается метод (функция) OnDblclkList1().

3. Выполним инициализацию объекта m_list с помощью его функции AddString() в функции инициализации диалога OnInitDialog():

BOOL CListsDlg::OnInitDialog()

{

CDialog::OnInitDialog();

…………………………

m_list.AddString("строка 01");

m_list.AddString("строка 02");

………………………………….

m_list.AddString("строка 12");

return TRUE;

}

4. Обработка двойного щелчка происходит в созданной нами функции OnDblclkList1().

void CListsDlg::OnDblclkList1()

{

m_list.GetText(m_list.GetCurSel(),m_text);

UpdateData(false);

}

При помощи метода GetText() класса CListBox получаем значение выбранной строки в переменную m_text. Для передачи значения переменной в текстовое поле используется функция UpdateData() с входным параметром false.

5. Запустите программу и дважды щелкните на одном из пунктов списка. Программа сообщит о выборе строки, отображая ее содержимое в текстовом поле.

6. Работа с комбинированным списком выполняется аналогичным образом.

10. Робота з елементами управління на прикладі використання повзунків.

Последовательность работы.

1. На первом этапе создается ресурс диалога, который включает ползунок (slider) и текстовое поле, в котором будет отображено положение ползунка. Затем создаем переменные m_slider типа CSliderCtrl и m_text типа CString по следующим идентификаторам рассматриваемых элементов управления, соответственно IDC_SLIDER1, IDC_EDIT1.

2. При перемещении бегунка элемент посылает сообщение WM_HSCROLL (WM_VSCROLL для вертикальных ползунков). При помощи ClassWizard свяжите сообщение WM_HSCROLL с методом OnHScroll() (OnVScroll() для вертикальных ползунков). Метод OnHScroll() обрабатывает сообщения, предназначенные для диалогового окна:

Параметрами данного метода являются код операции прокрутки, новая позиция бегунка и указатель на управляющий элемент, от которого поступило сообщение. Код операции может принимать стандартные значения.

В нашем случае используется код SB_THUMBPOSITION, посылаемый при перемещении бегунка. Текст программы:

void CSlidersDlg::OnHScroll(UINT nSBCode, UINT nPos, CScrollBar* pScrollBar)

{

if (SB_THUMBPOSITION == nSBCode)

{

m_text.Format("%ld",nPos);

UpdateData(false);

}

CDialog::OnHScroll(nSBCode, nPos, pScrollBar);

}

Здесь, при перемещении ползунка значение его позиции передается в текстовое поле. Инициализация элементов управления происходит следующим образом:

BOOL CSlidersDlg::OnInitDialog()

{

CDialog::OnInitDialog();

m_slider.SetRangeMin(1,false);

m_slider.SetRangeMax(100,false);

m_text = "1";

UpdateData(false);

return TRUE;

}

В данном фрагменте устанавливается интервал ползунка от 1 до 100, который задается с помощью методов SetRangeMin(),SetRangeMax() класса CSliderCtrl. Начальное значение, отображаемое в текстовом поле, принято равным единице.


 

11. Робота з контекстом CDC(Visual C++)

Объекты выводятся как в контекст рисования CDC так и в контекст метафайла (класс CMetaFileDC). Все объекты, кроме случайных линий рисуются в виде резинового контура (растягивание и сжатие графических объектов).

Последовательность работы.

1. В классе CPainterDoc добавляем указатель на объект контекста метафайла pMetaFileDC типа CMetaFileDC (CMetaFileDC* pMetaFileDC). Для открытия метафайла в конструкторе класса CPainterDoc выполнено следующее:

CPainterDoc::CPainterDoc()

{

pMetaFileDC = new CMetaFileDC();

pMetaFileDC->Create();

}

Все оставшиеся изменения данной программы выполнены в классе CPainterView.

2. Выбор фигур для рисования выполняется с помощью команд панели инструментов. Их рисунки будут соответственно, прямая, прямоугольник, эллипс, случайная линия.

В класс CPainterView введены следующие переменные типа boolean: bDrawFlag, bLineFlag, bRectangleFlag, bEllipseFlag, которые характеризуют при значении true подключение одной из кнопок выбора рисования объектов. Кроме того, в классе создаются две переменные типа CPoint: Anchor, OldPoint (координаты точки, которая запоминается при нажатии кнопки мыши и – при ее отпускании). В конструкторе класса им присваивается значение false. Для каждой кнопки по их отклику созданы функции: OnToolsDrawfreehand(), OnToolsEllipse(), OnToolsLine(), OnToolsRectangle(). В каждой из этих функций подключается функция MakeAllFlags(), в которой всем логическим переменным присваивается false, то есть сбрасываются все флаги, а только одной из них, в зависимости от выполненной команды (рисование линий, эллипса, прямоугольника, случайных линий). При нажатии левой кнопки мыши подключается функция OnLButtonDown. Здесь запоминаются ее координаты в переменных класса CPoint.

При перемещении мыши создается указатель контекста клиентского окна CClientDC*pDC для рисования в клиентском окне. Здесь же устанавливаются параметры пера класса CPen. Этот класс загружается в контекст клиентского окна и в контекст метафайла. Дальше подключаются фрагменты программ в зависимости от кода выбранного рисунка. Для случайных линий рисуется линия между начальной точкой, которая была сохранена в переменной Anchor и точкой, которая является входным параметром OnMouseMove. Линия рисуется в двух контекстах. При этом начальной точке присваиваются координаты конечной. Для всех других графических объектов используются бинарные растровые операции с помощью функции SetRop2(). С параметром R2_NOTXORPEN в этой функции любой графический объект будет представлен в инверсном режиме. Все объекты выводятся на экран в виде резинового контура.

В функции OnDraw() выводится на экран содержимое метафайла. При этом старый метафайл удаляется, а все его содержимое переписывается в новый метафайл. Эта функция подключается в том случае, когда возникает необходимость в перерисовке окна. Основная часть рисования выполняется в функции OnMouseMove().

В функции OnNew() создается чистый новый метафайл, и таким образом экран очищается. В функциях OnOpen() и OnSave(), соответственно открывается и сохраняется файл «painter.wmf» (.wmf – стандартное расширение для метафайлов Windows).

12. Програмування «резинових» контурів.

Чтобы стереть линию от Anchor до OldPoint, необходимо выбрать в контексте устройства бинарный растровый режим R2_N0T и снова нарисовать ту же линию. Что это значит? Бинарный растровый режим показывает, как будут выглядеть на экране результаты рисования (другими словами это и есть наш резиновый контур). Режим R2_N0T означает, что при рисовании каждого нового пикселя экранный пиксель инвертируется.

Обратите внимание — мы сохраняем старый бинарный растровый режим (целая величина), чтобы позднее восстановить его:

void CPainterView::OnMouseMove(UINT nFlags, CPoint point)

{

->> int nOldMode;

CClientDC* pDC = new CClientDC(this);

if((nFlags && MK_LBUTTON) && bl_ineFlag)

{

->> nOldMode = pDC->GetR0P2();

->> pDC->SetR0P2(R2_N0T);

->> pDC->MoveTo(Anchor.x, Anchor.y);

->> pDC->LineTo@1dPoint.x, OldPoint.y);

}

}

Затем мы рисуем новую линию, обновляем OldPoint и восстанавливаем предыдущий бинарный растровый режим контекста устройства:

void CPainterView::OnMouseMove(UINT nFlags, CPoint point)

{

int nOldMode;

CClientDC* pDC = new CClientDC(this);

if((nFlags && MK_LBUTTON) && bLineFlag)

{

nOldMode = pDC->GetR0P2();

pDC->SetR0P2(R2_N0T);

pDC->MoveTo(Anchor.x, Anchor.y);

pDC->LineTo@1dPoint.x, OldPoint.y);

->> pDC->MoveTo(Anchor.x, Anchor.y);

->> pDC->LineTo(point.x, point.y);

->> OldPoint.x = point.x;

->> OldPoint.y = point.y;

->> pDC->SetR0P2(n01dMode);

}

}

Теперь пользователь может сколько угодно растягивать рисуемую линию. Аналогично выглядит код для растягивания прямоугольников и эллипсов.

 

13. Серіалізація даних (візуал С++)

Сериализацией называется процесс записи или чтения некоторого объекта с диска.

Сериализация объекта StringData выполняется с помощью функции Serialize() класса CwriterDoc.

void CWriterDoc::Serialize(CArchive& ar)

{

if (ar.IsStoring())

{

ar << StringData; // код сохранения

}

else

{

ar >> StringData; // код загрузки

}

}

Этой функции передается объект класса CArchive. Сначала вызывается метод IsStoring() объекта ar, который возвращает true, если выполняется запись на диск (нажатие вкладки "Save” или "Save As”). В противном случае с диска считывается ранее созданный файл, содержащий строку. При закрытии приложения, если строка не была записана на диск, на экране выведется сообщение о выполнении этого действия. Это возможно только в том случае, если в функции OnChar() будет вызван метод SetModifiedFlag().

 

14. Робота з файлами.

Программа предназначена для выполнения стандартных операций работы с файлами(запись и чтение).

Последовательность работы.

1. Разместим на диалоге кнопку и два текстовых поля. В первое текстовое поле выводится инициализированная строка: «Учимся работать с файлами». При нажатии кнопки эта строка записывается на диск, затем считывается с него и помещается во второе текстовое поле. Приводятся только дополненные тексты программ, в функциях OnInitDialog(), а также в функции по отклику нажатия кнопки OnButton1(). Кроме того, приводится текст объявления класса CFilerDlg. Для привязки данных к текстовым полям используются переменные типа CString, m_text1 и m_text2, соответственно, для вводимого и выводимого полей. Кроме этих переменных в конструкторе объявлены две переменные типа char: OutString, InString. Тексты программ:

class CFilerDlg : public CDialog

{

public:

CFilerDlg(CWnd* pParent = NULL);

……………………………………………..

CString m_text1; // объявление пременных

CString m_text2; // объявление пременных

char OutString[4][20]; // резервирование памяти на 4 элементов по 20 символов в массив

char InString[20]; // резервирование памяти на 20 сиволов

virtual BOOL OnInitDialog();

afx_msg void OnButton1();

………………………………………….

};

BOOL CFilerDlg::OnInitDialog()

{

CDialog::OnInitDialog();

strcpy(OutString[0], "Учимся ");

strcpy(OutString[1], "работать ");

strcpy(OutString[2], "с ");

strcpy(OutString[3], "файлами ");

m_text1 =

CString(OutString[0]) + CString(OutString[1]) +

CString(OutString[2]) + CString(OutString[3]);

UpdateData(0);

…………………………………………………………………

return TRUE;

}

void CFilerDlg::OnButton1()

{

m_text2 = "";

CFile OutFile("data.dat",

CFile::modeCreate|CFile::modeWrite); //Файл открыт и готов к записи.

for(int loop_index = 0; loop_index < 4;loop_index++) // запишем в него четыре символьных строки с помощью метода Write() класса CFile:

{

OutFile.Write(OutString[loop_index],20);

}

OutFile.Close();

CFile InFile("data.dat", CFile::modeRead); //создания нового объекта InFile класса

CFile, который открывается в режиме чтения:

for(loop_index = 0; loop_index < 4;loop_index++) // цикл перебора массивов.

{

InFile.Seek(20*loop_index,CFile::begin); //для установки файлового указателя в начало каждой последующей строки:

int Num = InFile.Read(InString,20); //Данный метод возвращает количество фактически прочитанных символов, которое мы сохраняем в целой переменной Num

m_text2+=CString(InString); // переноситься все содержимое во второе текстовое поле

}

UpdateData(0); // перерисовка

InFile.Close(); // закрывается файл дата

 

16. Організація прокрутки в документах (скролінг) (Visual C++).

Базовым классом для программы является CScrollView.

При работе со скроллингом на базе класса CScrollView изменения выполняются только в одной функции OnInitialUpdate().

void CScrollerView::OnInitialUpdate()

{

CScrollView::OnInitialUpdate();

CSize sizeTotal;

CScrollerDoc* pDoc = GetDocument();

ASSERT_VALID(pDoc);

CClientDC dd(this);

sizeTotal = dd.GetTextExtent

(pDoc->StringData);

SetScrollSizes(MM_TEXT, sizeTotal);

}

В данном фрагменте скроллинг устанавливается с помощью функции SetScrollSizes(). Параметр MM_TEXT этой функции говорит о том, что значения заданы в экранных пикселях. Второй параметр – sizeTotal типа CSize определяет максимальную ширину (cx) и высоту (cy) выводимого объекта. Метод GetTextExtent() возвращает ширину – sizeTotal.cx и высоту – sizeTotal.cy, строки StringData.

Действия по прокрутке учитываются лишь в контексте устройства, специально подготовленном для метода OnDraw(). Для привязки скроллинга к собственному контексту используется функция OnPrepareDC(), входом в которую является адрес нового контекста.

 

 


 

17. Призначення основних об'єктів ADO в Visual C++ 

Интерфейс ADO составляют следующие классы объектов. Connection. Используется для связи с источником данных, а также для обработки некоторых команд и транзакций. Command. Используется для работы с командами, отправляемыми источнику данных. Recordset. Используется для работы с табличными данными, в том числе для извлечения и модификации данных. Field. Используется для представления информации о столбце в наборе записей, включая значения этого столбца и другую информацию. Рarameter. Используется для обмена данными с командами, отправляемыми источнику данных. Рroperty. Используется для манипулирования определенными свойствами других объектов, используемых в ADO. Еrror. Используется для получения более конкретной информации о возможных ошибках. Для взаимодействия с объектами ADO используются указатели, позволяющие получить доступ к различным объектам. Указатели на следующие объекты описаны в файле msado15.tlh. Основные из них: _ConnectionPtr, _CommandPtr, _RecordsetPtr, FieldsPtr, FieldPtr.

18. Ініціалізація об'єктів СОМ з використанням директиви #import 

Директива препроцессора #import при подключении автоматически создает два файла msado15.tlh, msado15.tli, генерируемые в выходном каталоге проекта и соответственно содержащие описание (хайдер) и реализацию (библиотеку) классов COM. Директиву #import можно включать в файл заголовка stdafx.h или в текущий файл .cpp, где используется работа с базой данных. Пример подключения директивы #import и хайдера msado15.tlh:

#import "c:\Program Files\Common Files\System\ADO\msado15.dll" rename("EOF", "ADO_EOF")

#include "msado15.tlh"

using namespace ADODB;

Директива #import создает классы из библиотеки типов MSADO15.DLL. Директиву #import следует применить только один раз (в данном случае, первые две строки), чтобы в текущем каталоге получить файлы msado15.tlh и msado15.tli. Для дальнейшей работы с ADO необходимо подключить только файл msado15.tlh (3-я и 4-я строки) с выделением соответствующей области ADODB. Когда использовалась директива #import, в файле msado15.tlh автоматически формировалась строка подключения библиотеки msado15.tli: #include "c:\vccp\ado\msado15.tli". Если оба файла находятся в текущей папке, то хайдер подключается, как: #include "msado15.tlh", а в конце файла msado15.tlh следует указать строку #include "msado15.tli". В том случае, если оба файла находятся в отдельной папке, скажем d:\ado1, тогда хайдер подключается, как: #include "d:\ado1\msado15.tlh", а в конце файла msado15.tlh следует указать строку #include "d:\ado1\msado15.tli".

19. Типи даних СОМ (_variant_t, _bstr_t) 

_variant_t. Инкапсулирует тип данных variant и может значительно упростить код приложения, поскольку работа с данными variant напрямую является несколько трудоемкой. _bstr_t. Инкапсулирует тип данных bstr. Этот класс обеспечивает встроенную обработку процедур распределения и освобождения ресурсов, а также других операций.

20. Створення об'єкту Connection(метод Open()). 

После создания экземпляра класса Connection необходимо вызвать его метод Open для подключения к источнику данных. Метод Open получает четыре параметра: строку соединения, идентификатор пользователя, пароль и параметр Options, который указывает каким образом, будет осуществляться соединение – синхронно (adConnectUnspecified – по умолчанию) или асинхронно (adAsyncConnect новые запросы выполняются, не ожидая ответов от предыдущих запросов). Строка подключения может содержать одно или несколько значений ключевых параметров, разделенных «;». В нашем примере (строка подключения "Provider = Microsoft.Jet.OLEDB.4.0; Data Source = C:\\VCCP\\ADO\\NWIND.MDB;") используются ключевые параметры Provider и DataSource. Ключевому параметру Provider соответствует значение провайдера OLEDB, ключевому параметру DataSource – имя источника данных в виде маршрута к базе данных nwind.mdb. При использовании ODBC ключевые слова провайдера и источника данных имеют другие значения. Например, строка подключения для ODBC может быть следующей:

pConn->("DRIVER=Driver do Microsoft Access (*.mdb); DBQ=D:\__Ado\ado_otl\NWIND.MDB","admin","",0);

Целесообразно при использовании ODBC в качестве строки подключения использовать DSN. Например,

pConn->Open("DSN=nwind","admin","",0);

 

21. Використання методу Execute() об'єкту Connection.

Execute(CommandText, RecordsAffected, Options) - Выполняет запрос, оператор SQL, хранимую процедуру или любую другую команду, доступную провайдеру. Возвращает объект Recordset, доступный только для чтения курсором, который просматривается только сверху-вниз (forward-only), если переданная команда возвращает записи. (Если нужен объект Recordset, доступный для записи, то следует создать его непосредственно, и воспользоваться его свойствами и методами.) Параметры:

- CommandText - обязательный. Строка, содержащая оператор SQL, имя таблицы, хранимой процедуры или другую команду провайдера.

- RecordsAffected - необязательный. Целое число (long), определяющее число записей.

- Options – необязательный. Целое число (long), определяющее тип команды. Возможные значения (можно выбирать несколько значений, используя поразрядное "ИЛИ"):

= adCmdText(1) – текстовое определение команды или хранимой процедуры.

= adCmdTable(2) – создание SQL-запроса, который возвращает все строки указанной таблицы.

= adCmdStoredProc(4) – хранимая процедура.

= adCmdUnknown(8) – тип команды неизвестен (по умолчанию).

= adAsyncExecute(16) – асинхронное выполнение команды.

= adExecuteNoRecords(128) – не возвращать строки.

Рекомендуется метод Execute использовать для SQL-запросов на выполнение, то есть все SQL-запросы без запросов на выборку. При этом в качестве 3-го параметра используется adCmdText. Запрос на выборку целесообразно формировать с использованием объекта Recordset, который содержит значительно больше параметров управления с набором данных, например редактирование базы данных через набор Recordset. Эта и многие другие возможности отсутствуют при использовании метода Execute. Кроме запросов на выборку, выполнение других SQL-запросов с БД целесообразно выполнять в объекте Connection с использованием метода Execute.

 


 

22. Робота з транзакціями.

Транзакции позволяют выполнить несколько различных операций над базой данных как единую операцию. Это очень полезно, если приходится одновременно модифицировать данные нескольких таблиц. Кроме того, транзакции позволяют избежать нежелательного эффекта незавершенных операций, что собственно и используется в данном примере. Если бы выполнялся метод Execute без использования транзакции, то управление сразу же после этого метода передавалось бы другим операторам программы по работе с БД, в то время как выполнение команды над базой данных (которая генерировалась методом Execute) еще не завершено. Транзакция исключает эту ситуацию, поскольку анализирует результат завершения команды.

Чтобы начать транзакцию для некоторого соединения, вызывается метод BeginTrans(), не зависящий от параметров. Затем можно вносить любые изменения в источник данных, которые составляют транзакцию.

Если все операции были выполнены успешно, и необходимо сохранить все изменения в базе данных, нужно вызвать метод CommitTrans() класса _ConnectionPtr. Если произошла ошибка или пользователь передумал вносить изменения, необходимо вызвать метод RollbackTrans(), отменяющий все изменения, внесенные с момента вызова метода BeginTrans().

ВНИМАНИЕ!!! Транзакция работает только с командами в синхронном режиме. Рекомендуется при работе с SQL-запросами на выполнение (удаление, обновление, добавление данных и т.д.) использовать транзакцию, так как она контролирует завершение операции.

23. Об'єкт Command. Створення та використання.

Объект Command используется для представления конкретных команд, выполняемых над источником данных. Эти объекты используются для отслеживания параметров, связанных с командой. Команду можно создать с использованием существующего соединения, а можно использовать новую команду соединения, созданного ADO.

Объекты ADO Command обеспечивают более гибкое взаимодействие с командами, выполняемыми над источником данных. Чтобы использовать объект Command, сначала необходимо создать экземпляр класса Command следующего вида:

_CommandPtr pCommand;

hr = pCommand.CreateInstance("ADODB.Command");

Затем нужно задать свойство команды CommandText, которое обычно содержит команду SQL, но может также включать имя таблицы или хранимой процедуры. Нужно также задать свойство CommandType, определяющее тип команды, содержащейся в CommandText.

Кроме того, можно задать свойство CommandTimeout и определить значение времени ожидания для этой команды. В противном случае, в качестве значения свойства CommandTimeout будет использоваться время ожидания соединения.

Перед выполнением команды с использованием объекта Command необходимо также задать свойство команды ActiveConnection. Оно может принимать значение указателя на существующий объект Connection или передавать строку соединения, В последнем случае ADO откроет новое соединение.

В следующем примере показано использование объекта Command для выполнения простой команды.

_CommandPtr pCommand;

hr = pCommand. Createlnstance ("ADODB. Command");

pCommand->ActiveConnection = m_piConnection;

pCommand->CortimandTimeout = 5;

pCommand->CommandType = adCmdText;

pCommand->CommandText = "INSERT INTO MyChapters VALUES (?, 'test', 22)";

_variant_t vNull; vNull.vt = VT_ERROR;

vNull.scode = DISP_E_PARAMNOTFOUND;

pRset = pCommand->Execute(SvRowsAffected, SvNull,adCmdText);

ОСОБЕННОСТИ РАБОТЫ С ОБЪЕКТОМ COMMAND!!! Объект Command предназначен для выполнения команд над источником данных. Преимущества объекта Command при работе с запросами заключаются в использовании команд с параметрами. Использование команд целесообразно в том случае, если одна команда выполняется несколько раз с незначительно отличающимися параметрами.

24. Об'єкт Recordset. Створення та використання.

Объект Recordset обеспечивает взаимодействие с данными. Он используется для хранения набора записей, возвращаемого из источника данных. Набор записей можно открыть напрямую, вызвав метод Open(), либо можно сгенерировать набор записей с помощью вызова метода Execute() для объекта соединения или команды.

Объект Recordset содержит все записи, возвращаемые из источника данных, однако в каждый момент времени можно работать лишь с одной текущей записью. Данными записи можно манипулировать с помощью объектов Field, содержащихся в коллекции Fields.

Целесообразно создавать набор Recordset с помощью объекта Recordset, используя метод Open(). Это позволяет создавать набор данных, как на сервере, так и на месте клиента. В последнем случае значительно оперативней обрабатываются данные, а также имеется возможность подключать различные ActiveX-компоненты, которые используют набор Recordset со стороны клиентской части. Можно создавать объекты Recordset и с помощью объектов Connection и Command, используя метод Execute(). Однако в этом случае месторасположение набора данных зависит от свойства CursorLocation объекта Connection, наследуемого всеми объектами Recordset. По умолчанию все курсоры установлены со стороны сервера. Удачным подходом является комбинированное использование объектов Connection-Recordset, Command-Recordset, Connection-Command-Recordset. Каждый из этих объектов имеет свои преимущества, соответственно при подключении, выполнении команд и работой с набором данных.

Скажем, для первой предлагаемой пары объектов, целесообразно выполнить подключение в объекте Connection, а используя его метод Execute(), выполнять команды без использования SQL- запросов на выборку. Преимущество выполнения таких команд, как было отмечено выше, заключается в возможности выполнения транзакций. Формирование же набора данных целесообразно выполнить в объекте Recordset (метод Open()). При этом использовать в качестве параметра ActiveConnection метода Open() объект Connection, то есть использовать ранее созданное подключение к источнику данных.


 

25. Створення об'єкту Recordsetз використанням об'єкта Connection.

_ConnectionPtr pConn;

pConn.CreateInstance("ADODB.Connection");

pConn->Mode=adModeReadWrite;

pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;

Data Source=C:\\VCCP\\ADO\\NWIND.MDB;","admin","",0);

_RecordsetPtr pRsProducts;

pRsProducts = pConn->Execute((_bstr_t) "SELECT * FROM Products", 0, adCmdUnknown);

pRsProducts->Close();

pConn->Close();

26. Створення об'єкту Recordsetз використанням об'єкта Recordset.

RecordsetPtr pRsProducts("ADODB.Recordset");

pRsProducts->Open("SELECT * FROM Products","DRIVER=Microsoft Access Driver (*.mdb); DBQ=D:\\VC6\\NWIND.MDB", adOpenStatic,adLockOptimistic,adCmdText);

pRsProducts->Close();

27. Створення об'єкту Recordsetз використанням об'єкта Command.

_CommandPtr pCommand ("ADODB.Command");

pCommand->ActiveConnection = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\VCCP\\ADO\\NWIND.MDB”;

pCommand->PutCommandText("Invoices");

_RecordsetPtr pRsSales;

pRsSales = pCommand->Execute(0,0,adCmdStoredProc);

pCommand->Close();

28. Створення об'єкту Recordsetз використанням об'єкта Connection-Command.

_ConnectionPtr pConn("ADODB.Connection");

pConn->Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=C:\\VCCP\\ADO\\NWIND.MDB" ","","",0);

_CommandPtr pCommand ("ADODB.Command");

pCommand->ActiveConnection = pConn;

_RecordsetPtr pRsSales;

pRsSales=pCommand->Execute(0,0,adCmdStoredProc);

pConn->Close();

29. Переміщення по записам об'єкта Recordset. 

pRsProducts->MoveFirst(); // переход на первую запись

pRsProducts->MoveLast(); // переход на последнюю запись

pRsProducts->MoveNext(); // переход на следующую запись

pRsProducts->MovePrevious(); // переход на предыдущую запись

pRsProducts->Move (5); //переход на 5 записей вниз относительно текущей

pRsProducts->Move (-5); //переход на 5 записей вверх относительно текущей

Переход на указанную позицию (строку) в наборе Recordset

Следует отметить, что установка абсолютных позиций для перемещения на указанную запись или страницу (свойства AbsolutePosition, AbsolutePage) для входа требуют структуру типа PositionEnum. В данном случае реализован универсальный подход, чтобы иметь возможность пользоваться, как перечисляемыми константами enum, так и своими собственными целыми значениями. Так, в нашем случае, для перехода на вторую запись необходимо число 2 привести к типу (PositionEnum).

pRsProducts->AbsolutePosition = (PositionEnum)2; // использование свойства AbsolutePosition для перехода на вторую запись

pRsProducts->PutAbsolutePosition((PositionEnum)2); // использование функции PutAbsolutePosition для перехода на вторую запись

Для того чтобы узнать текущую позицию в наборе, можно воспользоваться функцией GetAbsolutePosition(), которая возвращает целое значение типа PositionEnum.

PositionEnum tt;

tt = pRsProducts->GetAbsolutePosition();

Для перехода на указанную страницу можно воспользоваться свойством AbsolutePage, которое также требует переменную типа PositionEnum

pRsProducts->AbsolutePage = (PositionEnum)3; // использование свойства AbsolutePage для перехода на третью страницу

pRsProducts->PutAbsolutePage((PositionEnum)3); // использование функции PutAbsolutePage для перехода на третью страницу

 

30.Видалення записів у об'єкті Recordset.

Для удаления записей предназначен метод Delete(). В качестве входного параметра AffectRecords может быть adAffectCurrent – удаление текущей записи, adAffectGroup – удаляет все строки, соответствующие свойству Filter, adAffectAll – удаляет все записи.

pRsProducts->Delete(adAffectCurrent); // удаление текущей записи

31. Додавання записів у об'єкті Recordset.

Добавление пустой и обновление текущей записи Recordset осуществляется, соответственно с помощью методов AddNew() и Update().

pRsProducts->AddNew(); // создание новой пустой записи

pRsProducts->Update(); // обновление текущей записи

32. Оновлення записів у об'єкті Recordset.

Добавление пустой и обновление текущей записи Recordset осуществляется, соответственно с помощью методов AddNew() и Update().

pRsProducts->AddNew(); // создание новой пустой записи

pRsProducts->Update(); // обновление текущей записи


 





Реферат на тему: Microsoft Visual C++ (шпора)


Схожі реферати



5ka.at.ua © 2010 - 2016. Всі права застережені. При використанні матеріалів активне посилання на сайт обов'язкове.    
.