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

📄 dbstudent.cpp

📁 在Windows mobile6下的一个简单的EDB数据库创建添加查询等功能
💻 CPP
📖 第 1 页 / 共 2 页
字号:
	//定义流句柄
	HANDLE hStream = INVALID_HANDLE_VALUE ;

	//定义字段属性
	CEPROPVAL pProps[4];
	//定义学生编号查找字段属性
	CEPROPVAL seekPropVal;
	ZeroMemory(&seekPropVal,sizeof(seekPropVal));
	seekPropVal.propid = PID_NO;
	seekPropVal.val.lpwstr = (LPWSTR)strNo;

	//1,打开学生数据库
	if (!tblStudent.DB_Open_Student())
	{
		//打开学生数据库失败
		return FALSE;
	}

	//给字段属性赋值
	ZeroMemory(&pProps[0],sizeof(CEPROPVAL)*4);

	//学生学号
	pProps[0].propid = PID_NO; 
	pProps[0].val.lpwstr = LPWSTR(pRecStudent->szNo);
	pProps[0].wFlags = 0;

	//学生姓名
	pProps[1].propid = PID_NAME ; 
	pProps[1].val.lpwstr = LPWSTR(pRecStudent->szName);
	pProps[1].wFlags = 0;

	//学生出生日期
	pProps[2].propid = PID_BIRTHDAY;
	pProps[2].val.filetime  = pRecStudent->ftBirthday;
	pProps[2].wFlags = 0;

	//学生身高
	pProps[3].propid = PID_STATURE;
	pProps[3].val.lVal = pRecStudent->iStature;
	pProps[3].wFlags = 0;

	//
	//2,根据学生编号,查找到待修改的记录指针
	ceOid = CeSeekDatabaseEx(tblStudent.m_hDB,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&seekPropVal,1,&dwIndex);

	if (ceOid == 0)
	{
		TRACE(L"未查找到此记录\n");
		goto error;

	}
	
	//3,写入记录
	tmpCeOid = CeWriteRecordProps(tblStudent.m_hDB,ceOid,4,pProps);

	if (tmpCeOid == 0)
	{
		TRACE(L"写入记录失败\n");
		goto error;
	}

	//4,修改学生照片

	//打开流
	hStream = CeOpenStream(tblStudent.m_hDB,PID_IMAGE,GENERIC_WRITE);

	if (hStream == INVALID_HANDLE_VALUE)
	{
		TRACE(L"打开PID_IMAGE 流失败");
		goto error;
	}

	//将流字段清0
	if (!CeStreamSetSize(hStream,0))
	{
		TRACE(L"将流字段置0失败\n");
		goto error;
	}

	//如果照片数据不为0,写入照片数据
	if (pRecStudent->blImage.dwCount != 0)
	{
		//将学生照片数据写入流中
		if (!CeStreamWrite(hStream,pRecStudent->blImage.lpb,pRecStudent->blImage.dwCount,&dwWritten))
		{
			TRACE(L"将学生照片写入流,失败\n");
			goto error;
		}
	}

	//保存流数据
	if (!CeStreamSaveChanges(hStream))
	{
		TRACE(L"保存流数据失败\n");
		goto error;
	}

	//最后,关闭打开的流句柄
	CloseHandle(hStream);

	//关闭数据库
	tblStudent.DB_Close_Student();

	return TRUE;

error:
	//关闭数据库
	tblStudent.DB_Close_Student();

	if (hStream != INVALID_HANDLE_VALUE )
	{
		//关闭打开的流句柄
		CloseHandle(hStream);
	}
	return FALSE;
}

/*--------------------------------------------------------------------
【函数介绍】:  删除一条学生记录
【入口参数】:  strNo : 学生编号
【出口参数】:  (无)
【返回  值】:  TRUE : 成功 ; FALSE :失败
---------------------------------------------------------------------*/
BOOL CDBStudent::DeleteStudent(LPCTSTR strNo)
{
	//定义学生数据库对象
	CDBStudent tblStudent; 
	//定义学生编号查找字段属性
	CEPROPVAL seekPropVal;  //
	CEOID ceOid;
	DWORD dwIndex = 0;

	//1,打开学生数据库
	if (!tblStudent.DB_Open_Student())
	{
		//打开学生数据库失败
		return FALSE;
	}
	
	//赋值学生编号查找字段属性
	ZeroMemory(&seekPropVal,sizeof(seekPropVal));
	seekPropVal.propid = PID_NO;
	seekPropVal.val.lpwstr = (LPWSTR)strNo;

	//根据学生编号,查找对应要删除的记录
	ceOid = CeSeekDatabaseEx(tblStudent.m_hDB,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&seekPropVal,1,&dwIndex);

	if (ceOid == 0)
	{
		TRACE(L"未查找到此记录\n");
		goto error;

	}
	
	//删除当前记录
	if (!CeDeleteRecord(tblStudent.m_hDB,ceOid))
	{
		TRACE(L"删除记录失败\n");
		goto error;
	}

	return TRUE;
error:
	//关闭数据库
	tblStudent.DB_Close_Student();
	return FALSE;
}



/*--------------------------------------------------------------------
【函数介绍】:  根据学生编号,查询记录
【入口参数】:  strNo : 学生编号
			   pRecStudent   : 查询到的学生记录信息
【出口参数】:  pRecStudent	 : 查询到的学生记录信息
			   备注:使用完该函数,还得动态释放pRecStudent->blImage.lpb内存,
			   采用LocalFree方法释放
【返回  值】:  TRUE : 成功 ; FALSE :失败
---------------------------------------------------------------------*/
BOOL CDBStudent::QueryStudent(const LPCTSTR strNo,REC_STUDENT *pRecStudent)
{
	//定义学生数据库对象
	CDBStudent tblStudent; 

	CEOID ceOid = 0;
	WORD wProps = 0;
	DWORD dwRecSize = 0;
	PBYTE pBuff = 0;
	DWORD dwIndex = 0;
	PCEPROPVAL pRecord = NULL;

	//定义学生编号查找字段属性
	CEPROPVAL seekPropVal;
	ZeroMemory(&seekPropVal,sizeof(seekPropVal));
	seekPropVal.propid = PID_NO;
	seekPropVal.val.lpwstr = (LPWSTR)strNo;

	//1,打开学生数据库
	if (!tblStudent.DB_Open_Student())
	{
		//打开学生数据库失败
		return FALSE;
	}

	//
	//根据学生编号查找记录
	ceOid = CeSeekDatabaseEx(tblStudent.m_hDB,CEDB_SEEK_VALUEFIRSTEQUAL,(DWORD)&seekPropVal,1,&dwIndex);
	if (ceOid != 0)
	{
		//读取所有字段值
		ceOid = CeReadRecordPropsEx(tblStudent.m_hDB,CEDB_ALLOWREALLOC,&wProps,NULL,&(LPBYTE)pBuff,&dwRecSize,NULL);
		
		pRecord = (PCEPROPVAL)pBuff;
		
		for (int i=0;i<wProps;i++)
		{
			switch((pRecord+i)->propid)
			{
			//学生编号
			case PID_NO:
				{
					wcscpy(pRecStudent->szNo,(pRecord+i)->val.lpwstr);
					break;
				}
			//学生姓名
			case PID_NAME:
				{
					wcscpy(pRecStudent->szName,(pRecord+i)->val.lpwstr);
					break;
				}
			//出生日期
			case PID_BIRTHDAY:
				{
					pRecStudent->ftBirthday = (pRecord+i)->val.filetime;
					break;
				}
			//身高
			case PID_STATURE:
				{
					pRecStudent->iStature = (pRecord+i)->val.lVal;
					break;
				}
			//照片
			case PID_IMAGE:
				{
					if (pRecStudent->blImage.lpb != NULL)
					{
						//先释放内存
						LocalFree((HLOCAL)pRecStudent->blImage.lpb);
						pRecStudent->blImage.lpb = NULL;
					}

					//赋值,照片大小
					pRecStudent->blImage.dwCount = (pRecord+i)->val.blob.dwCount;
					//分配内存
					pRecStudent->blImage.lpb = (BYTE*)LocalAlloc(LMEM_ZEROINIT,pRecStudent->blImage.dwCount);
					
					//拷贝内存
					CopyMemory(pRecStudent->blImage.lpb,(pRecord+i)->val.blob.lpb,pRecStudent->blImage.dwCount);
				}
			default:
				{

				}
			}

		}
		//释放内存
		LocalFree(pBuff);
	}
	else
	{
		goto error;
	}
	
	//关闭数据库
	tblStudent.DB_Close_Student();
	return TRUE;
error:
	//关闭数据库
	tblStudent.DB_Close_Student();

	return FALSE;
}

/*--------------------------------------------------------------------
【函数介绍】:  查询所有记录
【入口参数】:  (无)
【出口参数】:  pRecordCount :返回记录数
			   pRecStudent : 返回查询到的所有学生记录
【返回  值】:  TRUE : 成功 ; FALSE :失败
---------------------------------------------------------------------*/
BOOL CDBStudent::QueryAllRecords(DWORD *pRecordCount,REC_STUDENT **pRecStudent)
{
	//定义学生数据库对象
	CDBStudent tblStudent; 

	CEOID ceOid = 0;
	WORD wProps = 0;
	DWORD dwRecSize = 0;
	PBYTE pBuff = 0;
	DWORD dwIndex = 0;
	PCEPROPVAL pRecord = NULL;
	DWORD dwRecordCount = 0;


	//1,打开学生数据库
	if (!tblStudent.DB_Open_Student())
	{
		//打开学生数据库失败
		return FALSE;
	}

	//得到数据库记录数
	dwRecordCount = tblStudent.GetRecordCount(&tblStudent.m_VolGUID,tblStudent.m_ceOid);

	//返回记录数
	*pRecordCount = dwRecordCount;

	//如果记录数为0,返回
	if (dwRecordCount ==0)	
	{
		//关闭数据库
		tblStudent.DB_Close_Student();
		return TRUE;
	}

	//分配记录数组
	*pRecStudent = new REC_STUDENT[dwRecordCount];

	//置0
	ZeroMemory(*pRecStudent,sizeof(REC_STUDENT)*dwRecordCount);

	//读取所有记录
	for (int i=0;i<dwRecordCount;i++)
	{
		//移动记录指针
		ceOid = CeSeekDatabaseEx(tblStudent.m_hDB,CEDB_SEEK_BEGINNING,i,0,&dwIndex);

		ASSERT(ceOid !=0);
		pBuff = 0;	
		//读取所有字段值
		ceOid = CeReadRecordPropsEx(tblStudent.m_hDB,CEDB_ALLOWREALLOC,&wProps,NULL,&(LPBYTE)pBuff,&dwRecSize,NULL);
		
		ASSERT(ceOid != 0);
		
		pRecord = (PCEPROPVAL)pBuff;
		
		//读取所有字段值
		for (int j=0;j<wProps;j++)
		{
			switch((pRecord+j)->propid)
			{
			//学生编号
			case PID_NO:
				{
					wcscpy((*pRecStudent+i)->szNo,(pRecord+j)->val.lpwstr);
					break;
				}
			//学生姓名
			case PID_NAME:
				{
					wcscpy((*pRecStudent+i)->szName,(pRecord+j)->val.lpwstr);
					break;
				}
			//出生日期
			case PID_BIRTHDAY:
				{
					(*pRecStudent+i)->ftBirthday = (pRecord+j)->val.filetime;
					break;
				}
			//身高
			case PID_STATURE:
				{
					(*pRecStudent+i)->iStature = (pRecord+j)->val.lVal;
					break;
				}
			//照片
			case PID_IMAGE:
				{
					if ((*pRecStudent+i)->blImage.lpb != NULL)
					{
						//先释放内存
						LocalFree((HLOCAL)(*pRecStudent+i)->blImage.lpb);
						(*pRecStudent+i)->blImage.lpb = NULL;
					}

					//赋值,照片数据大小
					(*pRecStudent+i)->blImage.dwCount = (pRecord+j)->val.blob.dwCount;
					//分配内存
					(*pRecStudent+i)->blImage.lpb = (BYTE*)LocalAlloc(LMEM_ZEROINIT,(*pRecStudent+i)->blImage.dwCount);
					
					//拷贝内存
					CopyMemory((*pRecStudent+i)->blImage.lpb,(pRecord+j)->val.blob.lpb,(*pRecStudent+i)->blImage.dwCount);
				}
			default:
				{

				}
			}
		}
		//释放内存
		LocalFree(pBuff);
		
	}

	//关闭数据库
	tblStudent.DB_Close_Student();
	return TRUE;
error:
	//关闭数据库
	tblStudent.DB_Close_Student();

	return FALSE;
}

⌨️ 快捷键说明

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