Разработка пейджинговой программы – система клиент – сервер, страница 9

strCmd=_T("select * from UserList");

try{//создание объекта экземпляра объекта Recordset

if(FAILED(pRecordUser.CreateInstance(__uuidof(Recordset))) )

throw "CreateInstance()";

//открытиеобъекта Recordset

if(FAILED(pRecordUser->Open((LPCTSTR)strCmd,(LPCTSTR)strCnn,adOpenDynamic,adLockOptimistic,adCmdUnknown)))

throw "Connection->Open";

//получение указателя на интерфейс, используемый для обмена данными

if(FAILED(pRecordUser->QueryInterface(__uuidof(IADORecordBinding),(LPVOID *)&piAdoRecordBinding1)))

_com_issue_error(E_NOINTERFACE);

   // связать экземпляр класса хранения данных с набором записей

piAdoRecordBinding1->BindToRecordset(&user);

}

catch(const char *s){

MessageBox(s);

}

catch (...){

MessageBox("unknown User");

}

Класс хранения данных

// History.h: interface for the CHistory class.

//

//////////////////////////////////////////////////////////////////////

#if !defined(AFX_HISTORY_H__6C580445_FE64_407F_885D_E9E89EDB5755__INCLUDED_)

#define AFX_HISTORY_H__6C580445_FE64_407F_885D_E9E89EDB5755__INCLUDED_

#if _MSC_VER > 1000

#pragma once

#endif // _MSC_VER > 1000

#define INITGUID

// подключение динамической библиотеки msado15.dll

#import "C:\Program Files\Common Files\System\ADO\msado15.dll" rename_namespace("ADOCG") rename("EOF", "EndOfFile")

using namespace ADOCG;

#include "icrsint.h"

class CHistory : public CADORecordBinding   

{

//назначение переменных которые будут соответствовать полям в записях базы данных

BEGIN_ADO_BINDING(CHistory) // макрос для создания класса хранения данных

ADO_FIXED_LENGTH_ENTRY(1,adInteger, m_lCount, lCountStatus, FALSE) // ложь

ADO_FIXED_LENGTH_ENTRY(2,adInteger, m_lMyNamber, lMyNamberStatus, TRUE)   

ADO_FIXED_LENGTH_ENTRY(3,adInteger, m_lOutNamber, lOutNamberStatus,TRUE)

ADO_FIXED_LENGTH_ENTRY(4,adBoolean, m_bWhereFrom, lWhereFromStatus, TRUE)

ADO_FIXED_LENGTH_ENTRY(5,adDate, m_dtTime, lTimeStatus, TRUE)

ADO_VARIABLE_LENGTH_ENTRY2(6,adVarChar,m_szData,sizeof(m_szData),lDataStatus,TRUE)

END_ADO_BINDING()

public:

LONG m_lCount;

ULONG lCountStatus;

LONG m_lMyNamber;

ULONG lMyNamberStatus;

LONG m_lOutNamber;

ULONG lOutNamberStatus;

VARIANT_BOOL m_bWhereFrom;

ULONG lWhereFromStatus;

DATE m_dtTime;

ULONG lTimeStatus;

CHAR m_szData[255];

ULONG lDataStatus;

};

#endif // !defined(AFX_HISTORY_H__6C580445_FE64_407F_885D_E9E89EDB5755__INCLUDED_)

Листинг 2.

Класс производный от CAsyncSocket– перегружаем функции OnRecive(), OnSend(), OnClose() и перенаправляем их исполнение в главный класс(СClientDlg)  

// MySocket.cpp : implementation file

*

*

*

// CMySocket member functions

void CMySocket::SetParent(CDialog *pWnd)

{

m_pWnd=pWnd;

}

void CMySocket::OnReceive(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

if (nErrorCode == 0)

((CClientDlg*)m_pWnd)->OnReceive();

CAsyncSocket::OnReceive(nErrorCode);

}

void CMySocket::OnSend(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

if (nErrorCode == 0)

((CClientDlg*)m_pWnd)->OnSend();

CAsyncSocket::OnSend(nErrorCode);

}

void CMySocket::OnClose(int nErrorCode)

{

// TODO: Add your specialized code here and/or call the base class

if (nErrorCode == 0)

((CClientDlg*)m_pWnd)->OnClose();

CAsyncSocket::OnClose(nErrorCode);

}


Список литературы.

1.  Грегори, Кэйт «Использование Visual C++6. Специальное издание.»: Пер. с англ. –М.; СПб.; К.: издательский «Вильямс», 2002. – 864 с.: ил.

2.  Чепмен, Дэвис «Освой самостоятельно Visual C++.Net За 21 день»: Пер. с англ. –М.; СПб.; К.: издательский «Вильямс», 2002. – 720 с.: ил.

3.  Материалы сайта www.firststeps.ru\vc\mfchelp  Шаг 56 – «Эффекты OnSysCommand».

4.  Материалы сайта www.firststeps.ru\vc\mfchelp  шаги 107 – 109 «Работа с SysTray».

5.  Материалы сайта www.firststeps.ru\vc\mfc  шаг 32 «Использование таймера».

6.  Электронная документация MSDN Library April 2001.