📄 databaseserverview.cpp
字号:
// DatabaseServerView.cpp : implementation of the CDatabaseServerView class
//
#include "stdafx.h"
#include "DatabaseServer.h"
#include "DatabaseServerDoc.h"
#include "DatabaseServerView.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CDatabaseServerView
IMPLEMENT_DYNCREATE(CDatabaseServerView, CFormView)
BEGIN_MESSAGE_MAP(CDatabaseServerView, CFormView)
//{{AFX_MSG_MAP(CDatabaseServerView)
ON_BN_CLICKED(IDC_ADD_RECORD, OnAddRecord)
ON_NOTIFY(NM_CLICK, IDC_LIST_DATA, OnClickListData)
ON_BN_CLICKED(IDC_DELETE_RECORD, OnDeleteRecord)
ON_BN_CLICKED(IDC_MODIFY_RECORD, OnModifyRecord)
ON_WM_DESTROY()
ON_BN_CLICKED(IDC_START_SERVER, OnStartServer)
ON_MESSAGE(WM_NET_DATA_ARRIVE,OnDataArrivedMsg)
//}}AFX_MSG_MAP
// Standard printing commands
ON_COMMAND(ID_FILE_PRINT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_DIRECT, CFormView::OnFilePrint)
ON_COMMAND(ID_FILE_PRINT_PREVIEW, CFormView::OnFilePrintPreview)
ON_UPDATE_COMMAND_UI(ID_INDICATOR_COORD, OnUpdateIndicatorCoord)
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CDatabaseServerView construction/destruction
CDatabaseServerView::CDatabaseServerView()
: CFormView(CDatabaseServerView::IDD)
{
//{{AFX_DATA_INIT(CDatabaseServerView)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// TODO: add construction code here
}
CDatabaseServerView::~CDatabaseServerView()
{
}
void CDatabaseServerView::DoDataExchange(CDataExchange* pDX)
{
CFormView::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CDatabaseServerView)
DDX_Control(pDX, IDC_EDIT_SERVER_LOG, m_ctrlEditServerLog);
DDX_Control(pDX, IDC_LIST_DATA, m_ctrlListData);
//}}AFX_DATA_MAP
}
BOOL CDatabaseServerView::PreCreateWindow(CREATESTRUCT& cs)
{
// TODO: Modify the Window class or styles here by modifying
// the CREATESTRUCT cs
return CFormView::PreCreateWindow(cs);
}
void CDatabaseServerView::OnInitialUpdate()
{
CFormView::OnInitialUpdate();
GetParentFrame()->RecalcLayout();
ResizeParentToFit();
SetTimer(123,1000,NULL);
//0.初始化服务器
m_pServer=new CIocpModeSvr;
m_bServerStarted=FALSE;
//1.初始化数据库
InitDatabase();
//2.初始化表头
m_ctrlListData.InsertColumn(0,_T("姓 名"),LVCFMT_LEFT,100,-1);
m_ctrlListData.InsertColumn(1,_T("地 址"),LVCFMT_LEFT,100,-1);
m_ctrlListData.InsertColumn(2,_T("电 话"),LVCFMT_LEFT,150,-1);
m_ctrlListData.SetExtendedStyle(LVS_EX_FULLROWSELECT|LVS_EX_GRIDLINES);
//3.刷新数据
RefreshList();
//4.获取本机的IP
WORD wVersionRequested;
WSADATA wsaData;
wVersionRequested=MAKEWORD(2,2);
WSAStartup(wVersionRequested,&wsaData);
GetLocalHostName(m_strLocalName);
GetIpAddress(m_strLocalName,m_strLocalIP);
SetDlgItemText(IDC_STATIC_IP,m_strLocalName+"(本机)的IP:"+m_strLocalIP);
}
/////////////////////////////////////////////////////////////////////////////
// CDatabaseServerView printing
BOOL CDatabaseServerView::OnPreparePrinting(CPrintInfo* pInfo)
{
// default preparation
return DoPreparePrinting(pInfo);
}
void CDatabaseServerView::OnBeginPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add extra initialization before printing
}
void CDatabaseServerView::OnEndPrinting(CDC* /*pDC*/, CPrintInfo* /*pInfo*/)
{
// TODO: add cleanup after printing
}
void CDatabaseServerView::OnPrint(CDC* pDC, CPrintInfo* /*pInfo*/)
{
// TODO: add customized printing code here
}
/////////////////////////////////////////////////////////////////////////////
// CDatabaseServerView diagnostics
#ifdef _DEBUG
void CDatabaseServerView::AssertValid() const
{
CFormView::AssertValid();
}
void CDatabaseServerView::Dump(CDumpContext& dc) const
{
CFormView::Dump(dc);
}
CDatabaseServerDoc* CDatabaseServerView::GetDocument() // non-debug version is inline
{
ASSERT(m_pDocument->IsKindOf(RUNTIME_CLASS(CDatabaseServerDoc)));
return (CDatabaseServerDoc*)m_pDocument;
}
#endif //_DEBUG
/////////////////////////////////////////////////////////////////////////////
// CDatabaseServerView message handlers
void CDatabaseServerView::OnUpdateIndicatorCoord(CCmdUI* pCmdUI)
//这是手工的添加状态栏窗格用户界面处理函数:
{
pCmdUI->Enable(true);//必须启用后才能在自定义状态栏窗格中显示信息
CString time;
CTime now=CTime::GetCurrentTime();
time=now.Format(_T("当前时间: %Y年%m月%d日 %H:%M:%S"));
pCmdUI->SetText(time);
}
void CDatabaseServerView::InitDatabase()
{
//Access数据库初始化
char* szDesc;
TCHAR Temppath[MAX_PATH];
CString tem ;
::GetCurrentDirectory(MAX_PATH,Temppath);
tem=Temppath;
tem=tem+_T("\\Contact.mdb"); //获得当前数据库文件
szDesc=new char[256];
sprintf(szDesc,"DSN=%s;PWD=123;DBQ=%s","Contact",tem);
if(SQLConfigDataSource(NULL,ODBC_ADD_DSN,"Microsoft Access Driver (*.mdb)\0",(LPCSTR)szDesc)==FALSE)
{
//配置数据库失败
AfxMessageBox("创建DSN时,出现错误!");
return ;
}
//目的是在第一次运行时,自动建立数据源
}
void CDatabaseServerView::RefreshList()
{
m_ctrlListData.DeleteAllItems();
m_nSelected=-1;
CDatabase database;
CRecordset recordset;
CString tableName;
CString sSql;
//打开数据库
TRY
{
sSql.Format("DSN=%s;;","Contact");
database.OpenEx(sSql,CDatabase::noOdbcDialog);
}
CATCH(CDBException, e)
{
//错误代码为e->m_nRetCode
}
END_CATCH
recordset.m_pDatabase=&database;
tableName="Contact";
//查找记录
recordset.m_strFilter="";
sSql.Format("SELECT * FROM %s",tableName);
recordset.Open(CRecordset::dynaset,sSql);
if(recordset.IsBOF()&&recordset.IsEOF())
{
AfxMessageBox("没有记录!");
}
else
{
int nDataTotal=0;
CString Temp;
recordset.MoveFirst();
while(!recordset.IsEOF())
{
recordset.GetFieldValue((short)1,Temp);
m_ctrlListData.InsertItem(nDataTotal,Temp,-1);
recordset.GetFieldValue((short)2,Temp);
m_ctrlListData.SetItemText(nDataTotal,1,Temp);
recordset.GetFieldValue((short)3,Temp);
m_ctrlListData.SetItemText(nDataTotal,2,Temp);
nDataTotal++;
recordset.MoveNext();
}
}
//使用完这个数据库之后,关闭数据库以及记录集
if(recordset.IsOpen())
{
recordset.Close();
}
if(database.IsOpen())
{
database.Close();
}
SendBack();
}
void CDatabaseServerView::OnAddRecord()
{
CRecordDlg Dialog1;
if(Dialog1.DoModal()==IDCANCEL)
{
return;
}
if(Dialog1.m_strName=="")
{
AfxMessageBox("姓名不能为空!");
return;
}
//添加记录
CDatabase database;
CRecordset recordset;
CString tableName;
CString sSql;
//打开数据库
TRY
{
sSql.Format("DSN=%s;;","Contact");
database.OpenEx(sSql,CDatabase::noOdbcDialog);
}
CATCH(CDBException, e)
{
//错误代码为e->m_nRetCode
}
END_CATCH
recordset.m_pDatabase=&database;
tableName="Contact";
//查找记录
recordset.m_strFilter="";
sSql.Format("SELECT * FROM %s WHERE Name = '%s'",tableName,Dialog1.m_strName);
recordset.Open(CRecordset::dynaset,sSql);
if(recordset.IsBOF()&&recordset.IsEOF())
{
//增加这条记录
sSql.Format("INSERT INTO %s (Name, Address, Phone) VALUES ('%s','%s','%s')",tableName,Dialog1.m_strName,Dialog1.m_strAddress,Dialog1.m_strPhone);
database.ExecuteSQL(sSql);
}
else
{
AfxMessageBox("该记录已经存在,不能重复添加!");
}
//使用完这个数据库之后,关闭数据库以及记录集
if(recordset.IsOpen())
{
recordset.Close();
}
if(database.IsOpen())
{
database.Close();
}
RefreshList();
}
void CDatabaseServerView::OnClickListData(NMHDR* pNMHDR, LRESULT* pResult)
{
//选中一条记录
if(m_ctrlListData.GetSelectionMark()!=-1)
{
m_nSelected=m_ctrlListData.GetSelectionMark();
}
else
{
m_nSelected=-1;
}
*pResult = 0;
}
void CDatabaseServerView::OnDeleteRecord()
{
if(m_nSelected==-1)
{
AfxMessageBox("尚未选择要删除的记录!请先选择。");
return;
}
CString Name;
Name=m_ctrlListData.GetItemText(m_nSelected,0);
//删除记录
CDatabase database;
CRecordset recordset;
CString tableName;
CString sSql;
CString Temp;
//打开数据库
TRY
{
sSql.Format("DSN=%s;;","Contact");
database.OpenEx(sSql,CDatabase::noOdbcDialog);
}
CATCH(CDBException, e)
{
//错误代码为e->m_nRetCode
}
END_CATCH
recordset.m_pDatabase=&database;
tableName="Contact";
//查找这个记录是否存在
recordset.m_strFilter="";
sSql.Format("SELECT * FROM %s WHERE Name = '%s'",tableName,Name);
recordset.Open(CRecordset::dynaset,sSql);
if(recordset.IsBOF()&&recordset.IsEOF())
{
//不存在,无法删除
AfxMessageBox("该记录不存在,无法删除!");
//使用完这个数据库之后,关闭数据库以及记录集
if(recordset.IsOpen())
{
recordset.Close();
}
if(database.IsOpen())
{
database.Close();
}
return;
}
else
{
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -