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

📄 cdatamanage.cpp

📁 在WinCe平台上开发的数据库管理程序,里面有一个可排序列表控件的实现和Excel的CVS文件的读写类
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	strData = m_propData[propid];
	return ID_SUCCESSFULLY;
}

//FUNCTION:
//	得到当前记录指定属性的内容
//PARAMETERS:
//	propid:	[in]属性ID
//	lData:	[out]属性内容
//	ID_SUCCESSFULLY:	成功
//	ID_PROPID_ERROR:	参数错误
WORD CDataManage::GetPropData(WORD propid, LONG *lData)
{
	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_LONG)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}

	*lData = _ttol(m_propData[propid]);

	return ID_SUCCESSFULLY;
}

WORD CDataManage::GetPropData(WORD propid, FLOAT *fData)
{	
	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_DOT)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}

	*fData = _ttol(m_propData[propid]) / 100.0;
	
	return ID_SUCCESSFULLY;
}

WORD CDataManage::GetPropData(WORD propid, CTime &time)
{
	int iYear, iMonth, iDay, iHouse, iMin, iSec;

	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_DATE)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}
	

	_stscanf(m_propData[propid],_T("%d,%d,%d,%d,%d,%d"),
		&iYear, &iMonth, &iDay, &iHouse, &iMin, &iSec);
	if(iYear > 1000 && iYear < 3000 
		&& iMonth > 0 && iMonth < 13
		&& iDay > 0 && iDay < 32
		&& iMin >= 0 && iMin <= 60
		&& iSec >= 0 && iSec <= 60)
	{
		time = CTime(iYear, iMonth, iDay, iHouse, iMin, iSec);
	}
	
	return ID_SUCCESSFULLY;
}
//////////////////////////////////////////////////////////////////////////////////////
//FUNCTION:
//	设置当前记录指定属性的内容
//PARAMETERS:
//	propid:	[in]属性ID
//	strData:[in]属性内容
//RETURN:
//	ID_SUCCESSFULLY:	成功
//	ID_PROPID_ERROR:	参数错误
WORD CDataManage::SetPropData(WORD propid, const CString &strData)
{
	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_STR)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}
	
	m_propData[propid] = strData;
	m_modifyFlag = TRUE;
	m_bReloadFlag = TRUE;
	return ID_SUCCESSFULLY;
}

//FUNCTION:
//	设置当前记录指定属性的内容
//PARAMETERS:
//	propid:	[in]属性ID
//	lData:	[in]属性内容
//RETURN:
//	ID_SUCCESSFULLY:	成功
//	ID_PROPID_ERROR:	参数错误
WORD CDataManage::SetPropData(WORD propid, LONG lData)
{
	TCHAR p[50];

	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_LONG)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}

	_ltot(lData, p, 10);
	m_propData[propid] = p;
	m_modifyFlag = TRUE;
	m_bReloadFlag = TRUE;
	return ID_SUCCESSFULLY;
}


WORD CDataManage::SetPropData(WORD propid, FLOAT fData)
{
	TCHAR p[50];

	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_DOT)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}

	_ltot(fData * 100 + 0.5, p, 10);			//?这里要注意一个精度问题
	m_propData[propid] = p;
	m_modifyFlag = TRUE;
	m_bReloadFlag = TRUE;
	return ID_SUCCESSFULLY;
}

WORD CDataManage::SetPropData(WORD propid, const CTime &time)
{
	TCHAR p[50];

	if(propid < 0 || propid >= m_propNum)
	{
		return ID_PROPID_ERROR;
	}
	propid++;

	if(m_propidList[propid] != FIELD_TYPE_DATE)	//字段类型不匹配
	{
		return ID_TYPE_ERROR;
	}
	
	_stprintf(p, _T("%d,%d,%d,%d,%d,%d"), time.GetYear(), 
		time.GetMonth(), time.GetDay(), time.GetHour(), 
		time.GetMinute(), time.GetSecond());
	m_propData[propid] = p;
	m_modifyFlag = TRUE;
	m_bReloadFlag = TRUE;

	return ID_SUCCESSFULLY;
}
//////////////////////////////////////////////////////////////////////////////////////


//FUNCTION:
//	将数据库中的数据(.cdb)转换成unicode文本(.txt)格式保存
//PARAMETERS:
//	strFileName:	[in]unicode文本文件名
//RETURN:
//	ID_SUCCESSFULLY:	成功
//	其它:				失败
WORD CDataManage::SaveToCsv(const CString &strFileName)
{
	WORD i;
	WORD wErrCode;
	WORD wBufLen;
	CString strErrMes;
	CString strRecordBuffer;
	CString strABuffer;
	CString strFieldBuffer;

	CCsv csv;
	FILE *stream;
		
	//以写方式打开文件
	stream = _tfopen(strFileName, _T("w+b"));
	if( stream == NULL )
	{
		::AfxMessageBox(_T("open file error!"), MB_OK, NULL);
		return ID_OPEN_CSV_ERROR;
	}

	//如果记录数为空则只生成一个空文件
	if(GetCurRecrodNum() == 0)
	{
		fclose( stream );
		return ID_SUCCESSFULLY;
	}
	
	//定位到第一条记录
	wErrCode = Seek(CEDB_SEEK_BEGINNING, 0);
	switch(wErrCode)
	{
	case ID_SUCCESSFULLY:
		break;
	default:
		strErrMes.Format(_T("Error X-%d-X!"), wErrCode);
		::AfxMessageBox(strErrMes, MB_OK, NULL);
		fclose( stream );
		return wErrCode;
	}
	
	//255,254是文件类型的标识
	fputc(255, stream);
	fputc(254, stream);
	
	while(wErrCode == ID_SUCCESSFULLY)
	{
		//生成一条记录的CSV字符串
		strRecordBuffer = _T("");
		for(i = 1; i < m_propNum; i++)
		{
			strRecordBuffer += csv.StrToCsv(m_propData[i], strFieldBuffer);
			if(i < m_propNum - 1)
			{
				strRecordBuffer += _T("\t");
			}
		}
		strRecordBuffer += _T("\r\n");
		
		//写入一条记录
		wBufLen = strRecordBuffer.GetLength();
		fwrite(strRecordBuffer, sizeof(TCHAR), wBufLen, stream);
	
		//下一条记录
		wErrCode = Seek(CEDB_SEEK_CURRENT, 1);
		switch(wErrCode){
		case ID_SUCCESSFULLY:
			break;
		case ID_SEEK_ERROR:
		case ID_NULL_ERROR:
			//::AfxMessageBox(_T("传输完毕!"), MB_OK, NULL);
			break;
		default:
			strErrMes.Format(_T("Error X-%d-X!"), wErrCode);
			::AfxMessageBox(strErrMes, MB_OK, NULL);
			return wErrCode;
			break;
		}
	}

	fclose( stream );
	Seek(CEDB_SEEK_BEGINNING, 0);
	return ID_SUCCESSFULLY;
}


WORD CDataManage::LoadFromCsv(const CString &strFileName)
{
	WORD wErrCode;
	WORD i;
	WORD csvCount;
	CString strFieldBuffer;
	TCHAR readBuf[2] = {0,0};
	BOOL bFullFlag;
	
	CCsv csv;
	FILE *stream;
	
	//打开数据库并识别标志位
	stream = _tfopen(strFileName, _T("r+b"));
	if( stream == NULL )
	{
		//::AfxMessageBox(_T("open file error!"), MB_OK, NULL);
		return ID_OPEN_CSV_ERROR;
	}
	
	if(fgetc(stream) != 255)
	{
		return ID_ERROR_FILE;
	}

	if(fgetc(stream) != 254)
	{
		return ID_ERROR_FILE;
	}
	
	//删除数据库中的所有记录
	wErrCode = m_selfCigdata.ClearAllRecord();
	if(wErrCode != ID_SUCCESSFULLY)
	{
		return wErrCode;
	}
	m_wNextRecordNum = 10000;					//记录内部索引计数复位
	
	//增加一条新的空记录
	wErrCode = AddNewRecord();
	if(wErrCode != ID_SUCCESSFULLY)
	{
		fclose( stream );
		return wErrCode;
	}

	//读取数据,加入到CE数据库中
	i = 1;
	bFullFlag = FALSE;
	while(1)
	{
		strFieldBuffer = _T("");
		csvCount = 0;
		while(fread(readBuf, sizeof(TCHAR), 1, stream) == 1)
		{
			switch(readBuf[0])
			{
			//出现字段分隔符
			case ',':
			case '\t':
				if((csvCount / 2) * 2 == csvCount)		//表示字段分隔
				{
					goto READ_A_FIELD_OVER;
				}
				if(!bFullFlag)							//表示字段中的内容
				{
					strFieldBuffer += readBuf;
				}
				break;
			//出现记录分隔符
			case '\r':
				if((csvCount / 2) * 2 == csvCount)		//表示记录分隔
				{
					goto READ_A_RECORD_OVER;
				}
				if(!bFullFlag)							//表示字段中的内容
				{
					strFieldBuffer += _T("\r\n");
				}
				break;
			case '\n':
				break;									//忽略换行符
			case '\"':									
				csvCount++;								//"号计数
			default:
				if(!bFullFlag)
				{
					strFieldBuffer += readBuf;
				}
				break;
			}
		}
		goto READ_A_FILE_OVER; 

//读完一个字段
READ_A_FIELD_OVER:
		//写入字段并忽略多出的字段
		if(!bFullFlag)
		{
			csv.CsvToStr(strFieldBuffer, m_propData[i]);
			//读取下一个字段,容错,忽略多出的字段
			i++;						
			if(i >= m_propNum)
			{
				bFullFlag = TRUE;
			}
		}
		continue;

//读完一条记录
READ_A_RECORD_OVER:
		//写入字段并忽略多出的字段
		if(!bFullFlag)
		{
			csv.CsvToStr(strFieldBuffer, m_propData[i]);
		}
		
		//新增下一条记录
		m_modifyFlag = TRUE;
		wErrCode = AddNewRecord();
		if(wErrCode != ID_SUCCESSFULLY)
		{
			fclose( stream );
			return wErrCode;
		}
		i = 1;
		bFullFlag = FALSE;
		continue;
	}
READ_A_FILE_OVER:
	fclose(stream);
	
	//删除多出的最后一条记录并复位记录
	wErrCode = DelCurRecord();
	if(wErrCode != ID_SUCCESSFULLY)
	{
		Seek(CEDB_SEEK_BEGINNING, 0);
		return wErrCode;
	}

	Seek(CEDB_SEEK_BEGINNING, 0);
	
	return ID_SUCCESSFULLY;
}

//数据显示是否需要更新
BOOL CDataManage::IsReload()
{
	if(m_bReloadFlag)
	{
		m_bReloadFlag = FALSE;
		return TRUE;
	}
	else
	{
		return FALSE;
	}
}
///////////////////////////////////////////////////////////////////////////////////
BOOL CDataManage::CompareVal(WORD propid, WORD compType, const CString &strVal)
{
	CString strTemp;
	
	//读取字段内容
	if(GetPropData(propid, strTemp) != ID_SUCCESSFULLY)
	{
		return FALSE;
	}
	
	//是否匹配
	switch(compType)
	{
	case CDM_FIND_SMALLER:
		if(strTemp < strVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_EQU:
		if(strTemp == strVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_GREATER:
		if(strTemp == strVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_NEAR:
		if(strTemp.Find(strVal, 0) != -1)
		{
			return TRUE;
		}
		break;
	default:
		break;
	}
	return FALSE;
}



BOOL CDataManage::CompareVal(WORD propid, WORD compType, LONG lVal)
{
	LONG lTemp;
	
	//读取字段内容
	if(GetPropData(propid, &lTemp) != ID_SUCCESSFULLY)
	{
		return FALSE;
	}
	
	//是否匹配
	switch(compType)
	{
	case CDM_FIND_SMALLER:
		if(lTemp < lVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_EQU:
		if(lTemp == lVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_GREATER:
		if(lTemp > lVal)
		{
			return TRUE;
		}
		break;
	default:
		break;
	}
	return FALSE;
}


BOOL CDataManage::CompareVal(WORD propid, WORD compType, FLOAT fVal)
{
	FLOAT fTemp;
	
	if(GetPropData(propid, &fTemp) != ID_SUCCESSFULLY)
	{
		return FALSE;
	}

	switch(compType)
	{
	case CDM_FIND_SMALLER:
		if(fTemp < fVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_EQU:
		if(abs(fTemp - fVal) < 0.0001)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_GREATER:
		if(fTemp > fVal)
		{
			return TRUE;
		}
		break;
	default:
		break;
	}
	return FALSE;
}

BOOL CDataManage::CompareVal(WORD propid, WORD compType, const CTime &tVal)
{
	CTime tTemp;

	if(GetPropData(propid, tTemp) != ID_SUCCESSFULLY)
	{
		return FALSE;
	}
	
	switch(compType)
	{
	case CDM_FIND_SMALLER:
		if(tTemp < tVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_EQU:
		if(tTemp == tVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_GREATER:
		if(tTemp > tVal)
		{
			return TRUE;
		}
		break;
	case CDM_FIND_NEAR:
		if(tTemp.GetYear() == tVal.GetYear()
			&& tTemp.GetMonth() == tVal.GetMonth()
			&& tTemp.GetDay() == tVal.GetDay())
		{
			return TRUE;
		}
		break;
	case CDM_FIND_YEAR_MONTH_EQU:
		if(tTemp.GetYear() == tVal.GetYear()
			&& tTemp.GetMonth() == tVal.GetMonth())
		{
			return TRUE;
		}
		break;
	case CDM_FIND_YEAR_EQU:
		if(tTemp.GetYear() == tVal.GetYear())
		{
			return TRUE;
		}
		break;
	default:
		break;
	}
	return FALSE;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -