?? 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 + -