📄 databaseclientdlg.cpp
字号:
// DatabaseClientDlg.cpp : implementation file
//
#include "stdafx.h"
#include "DatabaseClient.h"
#include "DatabaseClientDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDatabaseClientDlg dialog
CDatabaseClientDlg::CDatabaseClientDlg(CWnd* pParent /*=NULL*/)
: CDialog(CDatabaseClientDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CDatabaseClientDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CDatabaseClientDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDatabaseClientDlg)
DDX_Control(pDX, IDC_LIST_DATA, m_ctrlListData);
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CDatabaseClientDlg, CDialog)
//{{AFX_MSG_MAP(CDatabaseClientDlg)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_CONNECT, OnConnect)
ON_MESSAGE(WM_NET_DATA_ARRIVE,OnDataArrivedMsg)
ON_BN_CLICKED(IDC_ADD_RECORD, OnAddRecord)
ON_BN_CLICKED(IDC_DELETE_RECORD, OnDeleteRecord)
ON_BN_CLICKED(IDC_MODIFY_RECORD, OnModifyRecord)
ON_NOTIFY(NM_CLICK, IDC_LIST_DATA, OnClickListData)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDatabaseClientDlg message handlers
BOOL CDatabaseClientDlg::OnInitDialog()
{
CDialog::OnInitDialog();
// Set the icon for this dialog. The framework does this automatically
// when the application's main window is not a dialog
SetIcon(m_hIcon, TRUE); // Set big icon
SetIcon(m_hIcon, FALSE); // Set small icon
CenterWindow(GetDesktopWindow()); // center to the hpc screen
// TODO: Add extra initialization here
//1.初始化网络
m_pClient=new CNetClient;
m_bConnected=FALSE;
//2.初始化表头
m_ctrlListData.InsertColumn(0,_T("姓 名"),LVCFMT_LEFT,60,-1);
m_ctrlListData.InsertColumn(1,_T("地 址"),LVCFMT_LEFT,60,-1);
m_ctrlListData.InsertColumn(2,_T("电 话"),LVCFMT_LEFT,90,-1);
m_ctrlListData.SetExtendedStyle(LVS_EX_FULLROWSELECT);
return TRUE; // return TRUE unless you set the focus to a control
}
void CDatabaseClientDlg::OnDestroy()
{
CDialog::OnDestroy();
m_pClient->UnInit();
delete m_pClient;
}
void CDatabaseClientDlg::OnConnect()
{
if(!m_bConnected)
{
CString Ip;
GetDlgItemText(IDC_EDIT_SERVERIP,Ip);
char *ip;
ip=new char[Ip.GetLength()];
for(int i=0;i<Ip.GetLength();i++)
{
ip[i]=Ip.GetAt(i);
}
m_pClient->Init(OnDataArrive,ip,888,(DWORD)this);
delete ip;
SetDlgItemText(IDC_CONNECT,L"断开连接");
m_bConnected=TRUE;
//先更新一次表格
CString Sql(L"Request:QSELECT * FROM Contact");
SubmitRequest(Sql);
}
else
{
m_pClient->UnInit();
SetDlgItemText(IDC_CONNECT,L"连接服务器");
m_bConnected=FALSE;
}
}
void CDatabaseClientDlg::OnDataArrive(char * pData,unsigned long DataLength,DWORD userdata)
{
CDatabaseClientDlg* pDlg=(CDatabaseClientDlg*)userdata;
if(pData)
{
pDlg->SendMessage(WM_NET_DATA_ARRIVE,(WPARAM)pData,(LPARAM)DataLength);
}
}
LONG CDatabaseClientDlg::OnDataArrivedMsg(WPARAM wParam,LPARAM lParam)
{
//处理收到的数据
//这里为简单起见,处理的都是单纯的XML数据,并且格式已经固定
//再次开发可以按照自己的业务进行
CString Data;
Data=CString((char*)wParam).Left((int)lParam);
RefreshList(Data);
return 0;
}
void CDatabaseClientDlg::RefreshList(LPCTSTR Data)
{
//使用XML解析返回的结果并且更新表格显示
CMarkup *m_pXML;
m_pXML=new CMarkup(Data);
//查找结果集元素
m_pXML->ResetPos();
m_pXML->FindElem();
m_pXML->IntoElem();
m_pXML->FindElem();
m_pXML->FindElem();
m_pXML->IntoElem();
//向列表中添加记录
int nTotal=0;
m_ctrlListData.DeleteAllItems();
m_nSelected=-1;
while(m_pXML->FindElem())
{
//AfxMessageBox(m_pXML->GetTagName());
//AfxMessageBox(m_pXML->GetAttrib(L"Name"));
m_ctrlListData.InsertItem(nTotal,m_pXML->GetAttrib(L"Name"),-1);
m_ctrlListData.SetItemText(nTotal,1,m_pXML->GetAttrib(L"Address"));
m_ctrlListData.SetItemText(nTotal,2,m_pXML->GetAttrib(L"Phone"));
nTotal++;
}
delete m_pXML;
}
void CDatabaseClientDlg::SubmitRequest(CString Sql)
{
if(!m_bConnected)
{
return;
}
char *send;
send=new char [Sql.GetLength()];
//中文转换
int actuallength=0;
actuallength=WideCharToMultiByte(CP_ACP,NULL,(LPCWSTR)Sql.GetBuffer(0),Sql.GetLength(),(LPSTR)send,0,NULL,NULL);
delete send;
send=new char [actuallength];
ZeroMemory(send,actuallength);
WideCharToMultiByte(CP_ACP,NULL,(LPCWSTR)Sql.GetBuffer(0),Sql.GetLength(),(LPSTR)send,actuallength,NULL,NULL);
int nRet=m_pClient->SendMsg(send,actuallength);
delete send;
}
void CDatabaseClientDlg::OnAddRecord()
{
//输入记录
CRecordDlg Dialog1;
if(Dialog1.DoModal()==IDCANCEL)
{
return;
}
if(Dialog1.m_strName=="")
{
AfxMessageBox(L"姓名不能为空!");
return;
}
//先判断是否记录已经存在
CString Name;
for(int i=0;i<m_ctrlListData.GetItemCount();i++)
{
Name=m_ctrlListData.GetItemText(i,0);
if(Name==Dialog1.m_strName)
{
AfxMessageBox(L"该记录已经存在,不能重复添加!");
return;
}
}
//不存在,提交增加的请求
CString sSql;
sSql.Format(L"Request:AINSERT INTO Contact (Name, Address, Phone) VALUES ('%s','%s','%s')",Dialog1.m_strName,Dialog1.m_strAddress,Dialog1.m_strPhone);
SubmitRequest(sSql);
}
void CDatabaseClientDlg::OnDeleteRecord()
{
if(m_nSelected==-1)
{
AfxMessageBox(L"尚未选择要删除的记录!请先选择。");
return;
}
CString Name;
Name=m_ctrlListData.GetItemText(m_nSelected,0);
CString sSql;
sSql.Format(L"Request:DDELETE * FROM Contact WHERE Name = '%s'",Name);
SubmitRequest(sSql);
}
void CDatabaseClientDlg::OnModifyRecord()
{
if(m_nSelected==-1)
{
AfxMessageBox(L"尚未选择要修改的记录!请先选择。");
return;
}
CString Name,Address,Phone;
Name=m_ctrlListData.GetItemText(m_nSelected,0);
Address=m_ctrlListData.GetItemText(m_nSelected,1);
Phone=m_ctrlListData.GetItemText(m_nSelected,2);
CRecordDlg Dialog1;
Dialog1.m_strName=Name;
Dialog1.m_strAddress=Address;
Dialog1.m_strPhone=Phone;
if(Dialog1.DoModal()==IDCANCEL)
{
return;
}
//修改记录
CString sSql;
sSql.Format(L"Request:MUPDATE Contact SET Name= '%s',Address = '%s',Phone = '%s' WHERE Name = '%s'",Name,Dialog1.m_strAddress,Dialog1.m_strPhone,Name);
SubmitRequest(sSql);
}
void CDatabaseClientDlg::OnClickListData(NMHDR* pNMHDR, LRESULT* pResult)
{
//选中一条记录
if(m_ctrlListData.GetSelectionMark()!=-1)
{
m_nSelected=m_ctrlListData.GetSelectionMark();
}
else
{
m_nSelected=-1;
}
*pResult = 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -