📄 testdatabasedlg.cpp
字号:
// TestDatabaseDlg.cpp : implementation file
//
#include "stdafx.h"
#include "TestDatabase.h"
#include "TestDatabaseDlg.h"
#include "InputRecordDlg.h"
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
/////////////////////////////////////////////////////////////////////////////
// CTestDatabaseDlg dialog
CTestDatabaseDlg::CTestDatabaseDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestDatabaseDlg::IDD, pParent)
{
//{{AFX_DATA_INIT(CTestDatabaseDlg)
// 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;
m_ceOid = 0;
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
void CTestDatabaseDlg::DoDataExchange(CDataExchange* pDX)
{
CDialog::DoDataExchange(pDX);
//{{AFX_DATA_MAP(CTestDatabaseDlg)
// NOTE: the ClassWizard will add DDX and DDV calls here
//}}AFX_DATA_MAP
}
BEGIN_MESSAGE_MAP(CTestDatabaseDlg, CDialog)
//{{AFX_MSG_MAP(CTestDatabaseDlg)
ON_BN_CLICKED(IDC_ADD_RECORD, OnAddRecord)
ON_BN_CLICKED(IDC_CLOSE_DATABASE, OnCloseDatabase)
ON_BN_CLICKED(IDC_DELETE_RECORD, OnDeleteRecord)
ON_BN_CLICKED(IDC_EDIT_RECORD, OnEditRecord)
ON_BN_CLICKED(IDC_OPEN_DATABASE, OnOpenDatabase)
ON_BN_CLICKED(IDC_REFRESH_DATABASE, OnRefreshDatabase)
//}}AFX_MSG_MAP
END_MESSAGE_MAP()
/////////////////////////////////////////////////////////////////////////////
// CTestDatabaseDlg message handlers
BOOL CTestDatabaseDlg::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_RECORD_DATABASE);
CRect rt;
pListCtrl->GetClientRect(&rt);
pListCtrl->InsertColumn(0,_T("日期"), LVCFMT_LEFT,rt.Width() * 0.4);
pListCtrl->InsertColumn(1,_T("仓"), LVCFMT_LEFT,rt.Width() * 0.1);
pListCtrl->InsertColumn(2,_T("点"), LVCFMT_LEFT,rt.Width() * 0.1);
pListCtrl->InsertColumn(3,_T("位置"), LVCFMT_LEFT,rt.Width() * 0.1);
pListCtrl->InsertColumn(4,_T("号"), LVCFMT_LEFT,rt.Width() * 0.1);
pListCtrl->InsertColumn(5,_T("测量值"),LVCFMT_LEFT,rt.Width() * 0.2);
return TRUE; // return TRUE unless you set the focus to a control
}
void CTestDatabaseDlg::OnOpenDatabase()
{
// 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;
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 ;
}
}
}
/*
该函数得到数据库的记录条数
input: 数据库文件卷标识指针
数据库文件对象标识
output: 返回记录的条数,否则返回-1
*/
int CTestDatabaseDlg::GetRecordCount(CEGUID *pCeGuid,CEOID ceOid)
{
int iCount;
CEOIDINFO oidinfo;
if (!CeOidGetInfoEx(pCeGuid,ceOid,&oidinfo))
{
AfxMessageBox(_T("获取信息失败"));
return -1;
}
iCount = oidinfo.infDatabase.wNumRecords;
return iCount;
}
/*
添加一条新的记录
input: 数据库记录结构
output:成功true,失败false
*/
bool CTestDatabaseDlg::AddNewRecord(REC_RECORD rec)
{
CEOID ceOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[6];
memset(pProps,0,LocalSize(pProps)); //第一列:时间
pProps->propid = ID_DATA;
pProps->val.filetime = rec.cData;
pProps++; //第二列:仓
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_STOREHOUSE;
pProps->val.iVal = rec.Storehouse;
pProps++; //第三列:点
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_POINT;
pProps->val.iVal = rec.Point;
pProps++; //第四列:位置
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_POSITION;
pProps->val.iVal = rec.Position;
pProps++; //第五列:号
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_NUMBER;
pProps->val.iVal = rec.Number;
pProps++; //第六列:测量值
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_MEASUREVAL;
pProps->val.iVal = rec.MeasureVale;
pProps = pProps - 5;
ceOid = CeWriteRecordProps(m_hDB,0,6,pProps);
if(ceOid == 0)
{
return false;
}
return true;
}
/*
编辑记录
input : 数据库结构表,记录对象标识
output: 成功true,失败false
*/
bool CTestDatabaseDlg::EditRecord(REC_RECORD rec,CEOID ceOid)
{
CEOID tmpCeOid;
CEPROPVAL *pProps;
pProps = new CEPROPVAL[6];
memset(pProps,0,LocalSize(pProps)); //第一列:时间
pProps->propid = ID_DATA;
pProps->val.filetime = rec.cData;
pProps++; //第二列:仓
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_STOREHOUSE;
pProps->val.iVal = rec.Storehouse;
pProps++; //第三列:点
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_POINT;
pProps->val.iVal = rec.Point;
pProps++; //第四列:位置
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_POSITION;
pProps->val.iVal = rec.Position;
pProps++; //第五列:号
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_NUMBER;
pProps->val.iVal = rec.Number;
pProps++; //第六列:测量值
memset(pProps,0,LocalSize(pProps));
pProps->propid = ID_MEASUREVAL;
pProps->val.iVal = rec.MeasureVale;
pProps = pProps - 5;
tmpCeOid = CeWriteRecordProps(m_hDB,ceOid,6,pProps);
if(tmpCeOid == 0)
{
return false;
}
return true;
}
void CTestDatabaseDlg::OnAddRecord()
{
// TODO: Add your control notification handler code here
REC_RECORD rec_record;
CInputRecordDlg inputDlg;
if (inputDlg.DoModal() == IDOK)
{
SYSTEMTIME timeDest; //时间
inputDlg.m_Data.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_record.cData));
rec_record.Storehouse = inputDlg.m_StoreHouse; //仓
AddNewRecord(rec_record);
rec_record.Point = inputDlg.m_Point; //点
AddNewRecord(rec_record);
rec_record.Position = inputDlg.m_Position; //位置
AddNewRecord(rec_record);
rec_record.Number = inputDlg.m_Number; //号
AddNewRecord(rec_record);
rec_record.MeasureVale = inputDlg.m_MeasureVal; //测量值
AddNewRecord(rec_record);
}
//添加完成之后,调用刷新按钮单击方法
this->OnRefreshDatabase();
}
void CTestDatabaseDlg::OnCloseDatabase()
{
// TODO: Add your control notification handler code here
// 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 ;
}
}
void CTestDatabaseDlg::OnDeleteRecord()
{
// TODO: Add your control notification handler code here
//设置学生列表框标题
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDD_DATABASE);
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("删除失败"));
}
}
void CTestDatabaseDlg::OnEditRecord()
{
// TODO: Add your control notification handler code here
REC_RECORD rec_record;
CEOID ceOid;
PBYTE pBuff;
WORD wProps;
DWORD dwRecSize;
PCEPROPVAL pTempBuf;
REC_RECORD *pRecord;
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDD_DATABASE);
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);
pTempBuf = (PCEPROPVAL)pBuff;
pRecord = new REC_RECORD;
for (int i=0;i<wProps;i++)
{
switch(pTempBuf->propid)
{
case ID_DATA:
{
pRecord->cData = pTempBuf->val.filetime;
break;
}
case ID_STOREHOUSE:
{
pRecord->Storehouse = pTempBuf->val.lVal;
break;
}
case ID_POINT:
{
pRecord->Point = pTempBuf->val.lVal;
break;
}
case ID_POSITION:
{
pRecord->Position = pTempBuf->val.lVal;
break;
}
case ID_NUMBER:
{
pRecord->Number = pTempBuf->val.lVal;
break;
}
case ID_MEASUREVAL:
{
pRecord->Storehouse = pTempBuf->val.lVal;
break;
}
}
pTempBuf++;
}
LocalFree(pBuff);
CInputRecordDlg inputDlg;
//同步编辑对话框输入框值
SYSTEMTIME tmpTime;
FileTimeToSystemTime(&(pRecord->cData),&tmpTime);
inputDlg.m_Data = tmpTime;
inputDlg.m_StoreHouse = pRecord->Storehouse;
inputDlg.m_Point = pRecord->Point;
inputDlg.m_Position = pRecord->Position;
inputDlg.m_Number = pRecord->Number;
inputDlg.m_MeasureVal = pRecord->MeasureVale;
delete pRecord;
if (inputDlg.DoModal() == IDOK)
{
SYSTEMTIME timeDest;
inputDlg.m_Data.GetAsSystemTime(timeDest);
::SystemTimeToFileTime(&timeDest, &(rec_record.cData));
rec_record.Storehouse = inputDlg.m_StoreHouse; //仓
rec_record.Point = inputDlg.m_Point; //点
rec_record.Position = inputDlg.m_Position; //位置
rec_record.Number = inputDlg.m_Number; //号
rec_record.MeasureVale = inputDlg.m_MeasureVal; //测量值
EditRecord(rec_record,ceOid);
}
//编辑完成之后,调用刷新按钮单击方法
this->OnRefreshDatabase();
}
void CTestDatabaseDlg::OnRefreshDatabase()
{
// TODO: Add your control notification handler code here
CEOID ceOid;
WORD wProps;
DWORD dwRecSize;
PBYTE pBuff;
PCEPROPVAL pTempBuf;
REC_RECORD * pRecord;
//得到数据库记录数
int iRecordCount = GetRecordCount(&m_ceGuid,m_ceOid);
DWORD dwIndex;
CListCtrl * pListCtrl = (CListCtrl*)GetDlgItem(IDD_DATABASE);
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);
pTempBuf = (PCEPROPVAL)pBuff;
pRecord = new REC_RECORD;
for (int i=0;i<wProps;i++)
{
switch(pTempBuf->propid)
{
case ID_DATA:
{
pRecord->cData = pTempBuf->val.filetime;
break;
}
case ID_STOREHOUSE:
{
pRecord->Storehouse = pTempBuf->val.lVal;
break;
}
case ID_POINT:
{
pRecord->Point = pTempBuf->val.lVal;
break;
}
case ID_POSITION:
{
pRecord->Position = pTempBuf->val.lVal;
break;
}
case ID_NUMBER:
{
pRecord->Number = pTempBuf->val.lVal;
break;
}
case ID_MEASUREVAL:
{
pRecord->Storehouse = pTempBuf->val.lVal;
break;
}
}
pTempBuf++;
}
LocalFree(pBuff);
//向列表框中添加信息,时间
SYSTEMTIME systime;
FileTimeToSystemTime(&(pRecord->cData),&systime);
TCHAR szData[20];
swprintf(szData,_T("%d-%d-%d-%d-%d"),systime.wYear,systime.wMonth,systime.wDay,
systime.wHour,systime.wMinute);
pListCtrl->SetItemText(k,0,szData);
//添加数据,需要将数字转换成字符串
TCHAR szStoreHouse[3];
_itow(pRecord->Storehouse,szStoreHouse,6);
pListCtrl->SetItemText(k,1,szStoreHouse);
TCHAR szPoint[3];
_itow(pRecord->Point,szPoint,6);
pListCtrl->SetItemText(k,2,szPoint);
TCHAR szPosition[3];
_itow(pRecord->Position,szPosition,6);
pListCtrl->SetItemText(k,3,szPosition);
TCHAR szNumber[3];
_itow(pRecord->Number,szNumber,6);
pListCtrl->SetItemText(k,1,szNumber);
TCHAR szMeasureVal[5];
_itow(pRecord->MeasureVale,szMeasureVal,10);
pListCtrl->SetItemText(k,1,szMeasureVal);
delete pRecord;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -