📄 dbstudent.cpp
字号:
//定义流句柄
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 + -