📄 cedbusedlg.cpp
字号:
// CEDBUseDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CEDBUse.h"
#include "CEDBUseDlg.h"
#include "DriverInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCEDBUseDlg dialog
CCEDBUseDlg::CCEDBUseDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCEDBUseDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCEDBUseDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
// Note that LoadIcon does not require a subsequent DestroyIcon in Win32
//初始化数据库句柄
m_hDB = 0;
//将数据库对象标识设置为0
m_ceOid = 0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CCEDBUseDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCEDBUseDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCEDBUseDlg, CDialog)
//{{AFX_MSG_MAP(CCEDBUseDlg)
ON_BN_CLICKED(IDC_BTNOPEN, OnBtnopen)
ON_BN_CLICKED(IDC_BTNCLOSE, OnBtnclose)
ON_BN_CLICKED(IDC_BTNREFRESH, OnBtnrefresh)
ON_BN_CLICKED(IDC_BTNADD, OnBtnadd)
ON_BN_CLICKED(IDC_BTNEDIT, OnBtnedit)
ON_BN_CLICKED(IDC_BTNDELETE, OnBtndelete)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CCEDBUseDlg message handlers
BOOL CCEDBUseDlg::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
//设置驾驶员列表框标题
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_DRIVER);
CRect rt;
pListCtrl->GetClientRect(&rt);
pListCtrl->InsertColumn(0, _T("编号"), LVCFMT_LEFT, rt.Width() * 0.2);
pListCtrl->InsertColumn(1, _T("姓名"), LVCFMT_LEFT, rt.Width() * 0.3);
pListCtrl->InsertColumn(2, _T("出生日期"), LVCFMT_LEFT, rt.Width() * 0.3);
pListCtrl->InsertColumn(3, _T("身高"), LVCFMT_LEFT, rt.Width() * 0.2);
return TRUE; // return TRUE unless you set the focus to a control
}
/*
*函数介绍:“打开数据库”按钮单击事件函数
*入口参数:无
*出口参数:无
*返回值:无
*/
void CCEDBUseDlg::OnBtnopen()
{
// TODO: Add your control notification handler code here
//1.挂载数据库卷,如果存在则打开,不存在,则新建一个
if (!CeMountDBVol(&m_ceGuid, DBFILENAME, OPEN_ALWAYS))
{
AfxMessageBox(_T("打开或新建数据库卷失败"));
return;
}
//2.打开数据库
m_hDB = CeOpenDatabaseEx(&m_ceGuid, &m_ceOid, DBTABLENAME, NULL, CEDB_AUTOINCREMENT, NULL);
if (m_hDB == INVALID_HANDLE_VALUE)
{
//3.如果数据库不存在,则新建
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{
CEDBASEINFO ceDbInfo;
ceDbInfo.dwFlags = CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC;
wcscpy(ceDbInfo.szDbaseName, DBTABLENAME);
ceDbInfo.dwDbaseType = 0;
ceDbInfo.wNumSortOrder = 2; //排序字段数目
ceDbInfo.rgSortSpecs[0].propid = PID_NO;
//升序,且大小写无关
ceDbInfo.rgSortSpecs[0].dwFlags = CEDB_SORT_CASEINSENSITIVE;
ceDbInfo.rgSortSpecs[1].propid = PID_NAME;
//升序,且大小写无关
ceDbInfo.rgSortSpecs[1].dwFlags = CEDB_SORT_CASEINSENSITIVE;
m_ceOid = CeCreateDatabaseEx(&m_ceGuid, &ceDbInfo);
if (m_ceOid == 0)
{
AfxMessageBox(_T("创建数据库文件卷失败"));
//此处要卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
}
return;
}
//4.创建数据库后,应紧接着打开数据库
m_hDB = CeOpenDatabaseEx(&m_ceGuid, &m_ceOid, DBTABLENAME,
NULL, CEDB_AUTOINCREMENT, NULL);
if (m_hDB == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("打开数据库失败"));
//此处卸载数据库
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
}
return ;
}
}
else
{
AfxMessageBox(_T("打开数据库失败"));
//此处要卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
}
return;
}
}
}
/*
*函数介绍:“关闭数据库”按钮单击事件函数
*入口参数:无
*出口参数:无
*返回值L: 无
*/
void CCEDBUseDlg::OnBtnclose()
{
// TODO: Add your control notification handler code here
//1. 关闭数据库
if (!CloseHandle(m_hDB))
{
AfxMessageBox(_T("关闭数据库失败"));
return ;
}
//2.将数据库卷的数据缓冲到到永久存储介质上
if (!CeFlushDBVol(&m_ceGuid))
{
AfxMessageBox(_T("缓冲介质失败"));
return;
}
//3.卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库卷失败"));
return;
}
}
/*
*函数介绍:获取数据库的记录数目
*入口参数:pCeGuid: 数据库文件卷标识指针
ceOid: 数据库对象标识
*出口参数:无
*返回值: -1代表失败。如果成功,则返回实际的记录数
*/
int CCEDBUseDlg::GetRecordCount(CEGUID *pCeGuid, CEOID ceOid)
{
int iCount;
CEOIDINFO oidinfo;
if (!CeOidGetInfoEx(pCeGuid, ceOid, &oidinfo))
{
AfxMessageBox(_T("获取信息失败"));
return -1;
}
iCount = oidinfo.infDatabase.wNumRecords;
return iCount;
}
/*
*函数介绍:“刷新”按钮单击事件函数
*入口参数:无
*出口参数:无
*返回值: 无
*/
void CCEDBUseDlg::OnBtnrefresh()
{
// TODO: Add your control notification handler code here
CEOID ceOid;
WORD wProps;
DWORD dwRecSize;
PBYTE pBuff;
PCEPROPVAL pRecord;
REC_DRIVER * pDriver;
//得到数据库记录数
int iRecordCount = GetRecordCount(&m_ceGuid, m_ceOid);
DWORD dwIndex;
//设置驾驶员列表框标题
CListCtrl * pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_DRIVER);
pListCtrl->DeleteAllItems();
for (int k=0; k<iRecordCount; k++)
{
//移动记录指针
ceOid = CeSeekDatabase(m_hDB, CEDB_SEEK_BEGINNING, k, &dwIndex);
ASSERT(ceOid !=0);
pBuff = 0;
//读取所有字段值
ceOid = CeReadRecordProps(m_hDB, CEDB_ALLOWREALLOC, &wProps, NULL,
&(LPBYTE)pBuff, &dwRecSize);
ASSERT(ceOid !=0);
pRecord = (PCEPROPVAL)pBuff;
pDriver = new REC_DRIVER;
for (int i=0; i<wProps; i++)
{
switch(pRecord->propid)
{
case PID_NO:
{
wcscpy(pDriver->szNo, pRecord->val.lpwstr);
break;
}
case PID_NAME:
{
wcscpy(pDriver->szName, pRecord->val.lpwstr);
break;
}
case PID_BIRTHDAY:
{
pDriver->ftBrithday = pRecord->val.filetime;
break;
}
case PID_STATURE:
{
pDriver->iStature = pRecord->val.lVal;
break;
}
}
pRecord++;
}
LocalFree(pBuff);
//向列表框中添加驾驶员信息
pListCtrl->InsertItem(k, _T("Test"));
//添加驾驶员编号
pListCtrl->SetItemText(k, 0, pDriver->szNo);
//添加驾驶员姓名
pListCtrl->SetItemText(k, 1, pDriver->szName);
//添加驾驶员姓名,需要转换
SYSTEMTIME systime;
FileTimeToSystemTime(&(pDriver->ftBrithday), &systime);
TCHAR szBirthday[11];
swprintf(szBirthday, _T("%d-%d-%d"), systime.wYear, systime.wMonth, systime.wDay);
pListCtrl->SetItemText(k, 2, szBirthday);
//添加驾驶员身高,此处需要将数字转换成字符串
TCHAR szStature[5];
_itow(pDriver->iStature, szStature, 10);
pListCtrl->SetItemText(k, 3, szStature);
delete pDriver;
}
}
/*
*函数介绍:添加一条新记录
*入口参数:dri:驾驶员数据库结构
*出口参数:无
*返回值: 无
*/
BOOL CCEDBUseDlg::AddNewDriver(REC_DRIVER dri)
{
CEOID ceOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//驾驶员编号
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_NO;
pProps->val.lpwstr = dri.szNo;
//驾驶员姓名
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_NAME;
pProps->val.lpwstr = dri.szName;
//驾驶员出生日期
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = dri.ftBrithday;
//驾驶员身高
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = dri.iStature;
pProps = pProps -3;
ceOid = CeWriteRecordProps(m_hDB, 0, 4, pProps);
if (ceOid == 0)
{
return false;
}
return true;
}
/*
*函数介绍:编辑记录
*入口参数:dri:驾驶员数据库表结构
ceOid: 记录对象标识
*出口参数:无
*返回值:TRUE表示编辑成功, FALSE表示编辑失败
*/
BOOL CCEDBUseDlg::EditDriver(REC_DRIVER dri, CEOID ceOid)
{
CEOID tmpCeOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//驾驶员编号
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_NO;
pProps->val.lpwstr = dri.szNo;
//驾驶员姓名
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_NAME;
pProps->val.lpwstr = dri.szName;
//驾驶员出生日期
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = dri.ftBrithday;
//驾驶员身高
pProps++;
memset(pProps, 0, LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = dri.iStature;
pProps = pProps -3;
tmpCeOid = CeWriteRecordProps(m_hDB, ceOid, 4, pProps);
if (tmpCeOid == 0)
{
return false;
}
return true;
}
/*
*函数介绍:“添加记录”按钮事件函数
*入口参数:无
*出口参数:无
*返回值: 无
*/
void CCEDBUseDlg::OnBtnadd()
{
// TODO: Add your control notification handler code here
REC_DRIVER rec_dri;
CDriverInputDlg inputDlg;
if (inputDlg.DoModal() == IDOK)
{
//得到编号
wcscpy(rec_dri.szNo, LPCTSTR(inputDlg.m_no));
//得到姓名
wcscpy(rec_dri.szName, LPCTSTR(inputDlg.m_name));
//得到出生日期
SYSTEMTIME timeDest;
inputDlg.m_birthday.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_dri.ftBrithday));
//得到身高值
rec_dri.iStature = inputDlg.m_stature;
AddNewDriver(rec_dri);
}
}
/*
*函数介绍:编辑记录
*入口参数:无
*出口参数:无
*返回值: 无
*/
void CCEDBUseDlg::OnBtnedit()
{
// TODO: Add your control notification handler code here
REC_DRIVER rec_dri;
CEOID ceOid;
PBYTE pBuff;
WORD wProps;
DWORD dwRecSize;
PCEPROPVAL pRecord;
REC_DRIVER *pDriver;
//设置驾驶员列表框标题
CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_DRIVER);
int iItemIndex = pListCtrl->GetNextItem(-1, LVNI_SELECTED);
ASSERT(iItemIndex != -1);
DWORD dwIndex;
ceOid = CeSeekDatabase(m_hDB, CEDB_SEEK_BEGINNING, iItemIndex, &dwIndex);
ASSERT(ceOid !=0);
pBuff = 0;
//读取所有记录值
ceOid = CeReadRecordProps(m_hDB, CEDB_ALLOWREALLOC, &wProps, NULL,
&(LPBYTE)pBuff, &dwRecSize);
ASSERT(ceOid !=0);
pRecord = (PCEPROPVAL)pBuff;
pDriver = new REC_DRIVER;
for (int i=0; i<wProps; i++)
{
switch (pRecord->propid)
{
case PID_NO:
{
wcscpy(pDriver->szNo, pRecord->val.lpwstr);
break;
}
case PID_NAME:
{
wcscpy(pDriver->szName, pRecord->val.lpwstr);
break;
}
case PID_BIRTHDAY:
{
pDriver->ftBrithday = pRecord->val.filetime;
break;
}
case PID_STATURE:
{
pDriver->iStature = pRecord->val.iVal;
break;
}
}
pRecord++;
}
LocalFree(pBuff);
CDriverInputDlg inputDlg;
//同步编辑对话框输入框值
inputDlg.m_no = pDriver->szNo;
inputDlg.m_name = pDriver->szName;
SYSTEMTIME tmpTime;
FileTimeToSystemTime(&(pDriver->ftBrithday), &tmpTime);
inputDlg.m_birthday = tmpTime;
inputDlg.m_stature = pDriver->iStature;
delete pDriver;
if (inputDlg.DoModal() == IDOK)
{
//得到编号
wcscpy(rec_dri.szNo, LPCTSTR(inputDlg.m_no));
//得到姓名
wcscpy(rec_dri.szName, LPCTSTR(inputDlg.m_name));
//得到出生日期
SYSTEMTIME timeDest;
inputDlg.m_birthday.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_dri.ftBrithday));
//得到身高值
rec_dri.iStature = inputDlg.m_stature;
EditDriver(rec_dri, ceOid);
}
//编辑完后调用"刷新"按钮单击事件方法
OnBtnrefresh();
}
/*
*函数介绍:“删除当前记录”按钮事件函数
*入口参数:无
*出口参数:无
*返回值: 无
*/
void CCEDBUseDlg::OnBtndelete()
{
// TODO: Add your control notification handler code here
//设置驾驶员列表框标题
CListCtrl *pListCtrl = (CListCtrl *)GetDlgItem(IDC_LIST_DRIVER);
int iItemIndex = pListCtrl->GetNextItem(-1, LVNI_SELECTED);
ASSERT(iItemIndex != -1);
DWORD dwIndex;
CEOID ceOid;
ceOid = CeSeekDatabase(m_hDB, CEDB_SEEK_BEGINNING, iItemIndex, &dwIndex);
ASSERT(ceOid !=0);
if (!CeDeleteRecord(m_hDB, ceOid))
{
AfxMessageBox(_T("删除失败"));
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -