?? cdbusedlg.cpp
字號(hào):
// CDbuseDlg.cpp : implementation file
//
#include "stdafx.h"
#include "CDbuse.h"
#include "CDbuseDlg.h"
#include "StudentInputDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CCDbuseDlg dialog
CCDbuseDlg::CCDbuseDlg(CWnd* pParent /*=NULL*/)
: CDialog(CCDbuseDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CCDbuseDlg)
// 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);
m_hDB=0;
m_ceOid=0;
}
void CCDbuseDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CCDbuseDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CCDbuseDlg, CDialog)
//{{AFX_MSG_MAP(CCDbuseDlg)
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()
/////////////////////////////////////////////////////////////////////////////
// CCDbuseDlg message handlers
BOOL CCDbuseDlg::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
//設(shè)置學(xué)生列表框標(biāo)題
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDC_LST_STUDENT);
CRect rt;
pListCtrl->GetClientRect(&rt);
pListCtrl->InsertColumn(0,_T("編號(hào)"), 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 CCDbuseDlg::OnBtnopen()
{
// TODO: Add your control notification handler code here
//1、掛載數(shù)據(jù)庫(kù)卷,如果存在則打開(kāi),不存在,就新建一個(gè)
if (!CeMountDBVol(&m_ceGuid,DBFILENAME,OPEN_ALWAYS))
{
AfxMessageBox(_T("打開(kāi)或新建數(shù)據(jù)卷失敗"));
return;
}
RETAILMSG(1,(TEXT("dakai enter\n\r")));
//2、接著打開(kāi)數(shù)據(jù)庫(kù)
m_hDB = CeOpenDatabaseEx(&m_ceGuid,&m_ceOid,DBTABLENAME,NULL,CEDB_AUTOINCREMENT,NULL);
if (m_hDB == INVALID_HANDLE_VALUE)
{
//3、 //如果數(shù)據(jù)庫(kù)不存在,就新建之
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 ; //排序字段數(shù)目
ceDbInfo.rgSortSpecs[0].propid = PID_NO;
ceDbInfo.rgSortSpecs[0].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小寫(xiě)無(wú)關(guān)
ceDbInfo.rgSortSpecs[1].propid = PID_NAME;
ceDbInfo.rgSortSpecs[1].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小寫(xiě)無(wú)關(guān)
m_ceOid = CeCreateDatabaseEx(&m_ceGuid,&ceDbInfo);
if (m_ceOid == 0)
{
AfxMessageBox(_T("創(chuàng)建數(shù)據(jù)庫(kù)失敗"));
//此處得卸載數(shù)據(jù)庫(kù)卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸載數(shù)據(jù)庫(kù)文件卷失敗"));
}
return ;
}
//4、創(chuàng)建數(shù)據(jù)庫(kù)后,應(yīng)緊接著打開(kāi)數(shù)據(jù)庫(kù)
m_hDB = CeOpenDatabaseEx(&m_ceGuid,&m_ceOid,DBTABLENAME,NULL,CEDB_AUTOINCREMENT,NULL);
if (m_hDB == INVALID_HANDLE_VALUE)
{
AfxMessageBox(_T("打開(kāi)數(shù)據(jù)庫(kù)失敗"));
//此處得卸載數(shù)據(jù)庫(kù)卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸載數(shù)據(jù)庫(kù)文件卷失敗"));
}
return ;
}
}
else
{
AfxMessageBox(_T("打開(kāi)數(shù)據(jù)庫(kù)失敗"));
//此處得卸載數(shù)據(jù)庫(kù)卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸載數(shù)據(jù)庫(kù)文件卷失敗"));
}
return ;
}
}
RETAILMSG(1,(TEXT("dakai end!\n\r")));
}
void CCDbuseDlg::OnBtnclose()
{
// TODO: Add your control notification handler code here
//1、關(guān)閉數(shù)據(jù)庫(kù)
if (!CloseHandle(m_hDB))
{
AfxMessageBox(_T("關(guān)閉數(shù)據(jù)庫(kù)失敗"));
return;
}
//2、將數(shù)據(jù)庫(kù)卷的數(shù)據(jù)緩沖到永久存儲(chǔ)介質(zhì)上
if (!CeFlushDBVol(&m_ceGuid))
{
AfxMessageBox(_T("緩沖介質(zhì)失敗"));
return ;
}
//3、卸載數(shù)據(jù)庫(kù)卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸載數(shù)據(jù)庫(kù)文件卷失敗"));
return ;
}
}
void CCDbuseDlg::OnBtnrefresh()
{
// TODO: Add your control notification handler code here
RETAILMSG(1,(TEXT("OnBtnrefresh 1111\n\r")));
CEOID ceOid;
WORD wProps;
DWORD dwRecSize;
PBYTE pBuff;
PCEPROPVAL pRecord;
RETAILMSG(1,(TEXT("OnBtnrefresh 11111\n\r")));
REC_STUDENT * pStudent;
//得到數(shù)據(jù)庫(kù)記錄數(shù)
int iRecordCount = GetRecordCount(&m_ceGuid,m_ceOid);
DWORD dwIndex;
//設(shè)置學(xué)生列表框標(biāo)題
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDC_LST_STUDENT);
pListCtrl->DeleteAllItems();
RETAILMSG(1,(TEXT("OnBtnrefresh 22222\n\r")));
for (int k=0;k<iRecordCount;k++)
{
//移動(dòng)記錄指針
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);
RETAILMSG(1,(TEXT("OnBtnrefresh 3333\n\r")));
ASSERT(ceOid != 0);
pRecord = (PCEPROPVAL)pBuff;
pStudent = new REC_STUDENT;
for (int i=0;i<wProps;i++)
{
switch(pRecord->propid)
{
case PID_NO:
{
wcscpy(pStudent->szNo,pRecord->val.lpwstr);
break;
}
case PID_NAME:
{
wcscpy(pStudent->szName,pRecord->val.lpwstr);
break;
}
case PID_BIRTHDAY:
{
pStudent->ftBirthday = pRecord->val.filetime;
break;
}
case PID_STATURE:
{
pStudent->iStature = pRecord->val.lVal;
break;
}
}
pRecord++;
RETAILMSG(1,(TEXT("OnBtnrefresh 4444\n\r")));
}
LocalFree(pBuff);
RETAILMSG(1,(TEXT("OnBtnrefresh 5555\n\r")));
//向列表框中添加學(xué)生信息
pListCtrl->InsertItem(k,_T("Test"));
//添加學(xué)生編號(hào)
pListCtrl->SetItemText(k,0,pStudent->szNo);
RETAILMSG(1,(TEXT("OnBtnrefresh 66666\n\r")));
//添加學(xué)生姓名
pListCtrl->SetItemText(k,1,pStudent->szName);
//添加學(xué)生生日,此處需要做些轉(zhuǎn)換
SYSTEMTIME systime;
FileTimeToSystemTime(&(pStudent->ftBirthday),&systime);
TCHAR szBirthday[11];
swprintf(szBirthday,_T("%d-%d-%d"),systime.wYear,systime.wMonth,systime.wDay);
pListCtrl->SetItemText(k,2,szBirthday);
//添加學(xué)生身高,此處需要將數(shù)字轉(zhuǎn)換成字符串
TCHAR szStature[5];
_itow(pStudent->iStature,szStature,10);
pListCtrl->SetItemText(k,3,szStature);
RETAILMSG(1,(TEXT("OnBtnrefresh 7777\n\r")));
delete pStudent;
}
RETAILMSG(1,(TEXT("OnBtnrefresh end!\n\r")));
}
BOOL CCDbuseDlg::AddNewStudent(REC_STUDENT stu)
{
RETAILMSG(1,(TEXT("tian jia 22222\n\r")));
CEOID ceOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//學(xué)生學(xué)號(hào)
RETAILMSG(1,(TEXT("tian jia 333333\n\r")));
memset(pProps,0,LocalSize(pProps));
RETAILMSG(1,(TEXT("tian jia 4444\n\r")));
pProps->propid = PID_NO;
pProps->val.lpwstr = stu.szNo;
RETAILMSG(1,(TEXT("tian jia555\n\r")));
//學(xué)生姓名
pProps+=1;
RETAILMSG(1,(TEXT("tian jia123\n\r")));
// memset(pProps,0,LocalSize(pProps));
RETAILMSG(1,(TEXT("tian jia1234\n\r")));
pProps->propid = PID_NAME ;
RETAILMSG(1,(TEXT("tian jia12345\n\r")));
pProps->val.lpwstr = stu.szName;
RETAILMSG(1,(TEXT("tian jia 6666\n\r")));
//學(xué)生出生日期
pProps++;
// memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = stu.ftBirthday;
//學(xué)生身高
pProps++;
// memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = stu.iStature;
pProps = pProps -3 ;
ceOid = CeWriteRecordProps(m_hDB,0,4,pProps);
RETAILMSG(1,(TEXT("tian jia 7777\n\r")));
if (ceOid == 0)
{
return false;
}
RETAILMSG(1,(TEXT("tian jia 88888\n\r")));
return true;
}
BOOL CCDbuseDlg::EditStudent(REC_STUDENT stu, CEOID ceOid)
{
CEOID tmpCeOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//學(xué)生學(xué)號(hào)
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NO;
pProps->val.lpwstr = stu.szNo;
//學(xué)生姓名
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NAME ;
pProps->val.lpwstr = stu.szName;
//學(xué)生出生日期
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = stu.ftBirthday;
//學(xué)生身高
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = stu.iStature;
pProps = pProps -3 ;
tmpCeOid = CeWriteRecordProps(m_hDB,ceOid,4,pProps);
RETAILMSG(1,(TEXT("bianji 1111\n\r")));
if (tmpCeOid == 0)
{
return false;
}
return true;
}
void CCDbuseDlg::OnBtnadd()
{
// TODO: Add your control notification handler code here
RETAILMSG(1,(TEXT("tian jia 1111\n\r")));
REC_STUDENT rec_stu;
CStudentInputDlg inputDlg;
if (inputDlg.DoModal() == IDOK)
{
//得到編號(hào)
wcscpy(rec_stu.szNo,LPCTSTR(inputDlg.m_no));
//得到姓名
wcscpy(rec_stu.szName,LPCTSTR(inputDlg.m_name));
//得到出生日期
SYSTEMTIME timeDest;
inputDlg.m_birthday.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_stu.ftBirthday));
//得到身高值
rec_stu.iStature = inputDlg.m_stature;
RETAILMSG(1,(TEXT("tian jia 2222\n\r")));
AddNewStudent(rec_stu);
}
RETAILMSG(1,(TEXT("BOOL CCDbuseDlg::EditStudent(REC_STUDENT stu, CEOID ceOid)\n\r")));
//添加完成之后,調(diào)用刷新按鈕單擊方法
OnBtnrefresh();
}
void CCDbuseDlg::OnBtnedit()
{
// TODO: Add your control notification handler code here
RETAILMSG(1,(TEXT("bianji 1111\n\r")));
REC_STUDENT rec_stu;
CEOID ceOid;
PBYTE pBuff;
WORD wProps;
DWORD dwRecSize;
PCEPROPVAL pRecord;
REC_STUDENT *pStudent;
RETAILMSG(1,(TEXT("bianji 22222\n\r")));
//設(shè)置學(xué)生列表框標(biāo)題
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDC_LST_STUDENT);
int iItemIndex = pListCtrl->GetNextItem(-1,LVNI_SELECTED);
ASSERT(iItemIndex !=-1);
DWORD dwIndex;
ceOid = CeSeekDatabase(m_hDB,CEDB_SEEK_BEGINNING,iItemIndex,&dwIndex);
ASSERT(ceOid !=0);
RETAILMSG(1,(TEXT("bianji 33333\n\r")));
pBuff = 0;
//讀取所有記錄值
ceOid = CeReadRecordProps(m_hDB,CEDB_ALLOWREALLOC,&wProps,NULL,&(LPBYTE)pBuff,&dwRecSize);
RETAILMSG(1,(TEXT("bianji 444444\n\r")));
ASSERT(ceOid != 0);
pRecord = (PCEPROPVAL)pBuff;
pStudent = new REC_STUDENT;
for (int i=0;i<wProps;i++)
{
switch(pRecord->propid)
{
case PID_NO:
{
wcscpy(pStudent->szNo,pRecord->val.lpwstr);
break;
}
case PID_NAME:
{
wcscpy(pStudent->szName,pRecord->val.lpwstr);
break;
}
case PID_BIRTHDAY:
{
pStudent->ftBirthday = pRecord->val.filetime;
break;
}
case PID_STATURE:
{
pStudent->iStature = pRecord->val.lVal;
break;
}
}
pRecord++;
RETAILMSG(1,(TEXT("bianji 5555\n\r")));
}
LocalFree(pBuff);
RETAILMSG(1,(TEXT("bianji 66666\n\r")));
CStudentInputDlg inputDlg;
//同步編輯對(duì)話框輸入框值
inputDlg.m_no = pStudent->szNo;
inputDlg.m_name = pStudent->szName;
SYSTEMTIME tmpTime;
FileTimeToSystemTime(&(pStudent->ftBirthday),&tmpTime);
inputDlg.m_birthday = tmpTime;
inputDlg.m_stature = pStudent->iStature;
RETAILMSG(1,(TEXT("bianji 7777\n\r")));
delete pStudent;
if (inputDlg.DoModal() == IDOK)
{
//得到編號(hào)
wcscpy(rec_stu.szNo,LPCTSTR(inputDlg.m_no));
//得到姓名
wcscpy(rec_stu.szName,LPCTSTR(inputDlg.m_name));
//得到出生日期
SYSTEMTIME timeDest;
inputDlg.m_birthday.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_stu.ftBirthday));
//得到身高值
rec_stu.iStature = inputDlg.m_stature;
RETAILMSG(1,(TEXT("bianji 8888\n\r")));
EditStudent(rec_stu,ceOid);
RETAILMSG(1,(TEXT("bianji 99999\n\r")));
}
//編輯完成之后,調(diào)用刷新按鈕單擊方法
OnBtnrefresh();
RETAILMSG(1,(TEXT("bianji end\n\r")));
}
void CCDbuseDlg::OnBtndelete()
{
// TODO: Add your control notification handler code here
//設(shè)置學(xué)生列表框標(biāo)題
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDC_LST_STUDENT);
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("刪除失敗"));
}
}
int CCDbuseDlg::GetRecordCount(CEGUID *pCeGuid, CEOID ceOid)
{
int iCount;
CEOIDINFO oidinfo;
RETAILMSG(1,(TEXT("GetRecordCount enter\n\r")));
if (!CeOidGetInfoEx(pCeGuid,ceOid,&oidinfo))
{
AfxMessageBox(_T("獲取信息失敗"));
return -1;
}
iCount = oidinfo.infDatabase.wNumRecords;
RETAILMSG(1,(TEXT("GetRecordCount end\n\r")));
return iCount;
}
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -