⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 testdatabasedlg.cpp

📁 evc连接数据库 evc连接数据库 evc连接数据库
💻 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 + -