CE数据库
数据库卷是可以存储CE数据库的特殊格式的文件。
把数据库存储在文件中,就要用数据库卷,先打开或者新建数据库卷,关闭数据库后,还要卸载数据库卷
先装配(打开或新建)数据库卷
CEGUID m_ceGuid; //存储数据库文件卷标识(GUID)PCEGUID m_pCeGuid;
const LPTSTR DBFILENAME = _T("\\My Documents\\abc.db");//数据库文件名
//挂载数据库卷,OPEN_ALWAYS表示如果存在则打开,不存在,就新建一个数据库卷
if (!CeMountDBVol(&m_ceGuid,DBFILENAME,OPEN_ALWAYS))
{
AfxMessageBox(_T("打开或新建数据卷失败"));
return FALSE;
}
//了解系统中已装配好的数据库卷的信息
TCHAR szVolumeName[128];
CREATE_INVALIDGUID(&m_ceGuid);//首次使用时用该宏将&m_ceGuid设为无效。
while(CeEnumDBVolumes(&m_ceGuid,szVolumeName,sizeof(szVolumeName)))
{
AfxMessageBox(szVolumeName);
}
创建数据库
CeCreateDatabase()函数只能创建存放在对象存储库中的数据库
CeCreateDatabaseEx()函数除有以上函数功能外,可以创建存放在数据库卷中的数据库
const LPTSTR DBTABLENAME = _T("Student");//定义数据库名
CEOID m_ceOid; //DWORD型 存储数据库对象标识和记录对象标识,惟一标识数据库的ID,CeCreateDatabaseEx()返回
//在对象存储库外创建一个数据库
CEDBASEINFO ceDbInfo;//用来描述被创建的数据库名称、类型、排序方式以及数据库特征等信息
ceDbInfo.dwFlags = CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC ;
wcscpy(ceDbInfo.szDbaseName , DBTABLENAME);
ceDbInfo.dwDbaseType = 0;
ceDbInfo.wNumSortOrder = 2 ; //排序字段数目
ceDbInfo.rgSortSpecs[0].propid = PID_NO;
ceDbInfo.rgSortSpecs[0].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小写无关
ceDbInfo.rgSortSpecs[1].propid = PID_NAME;
ceDbInfo.rgSortSpecs[1].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小写无关
m_ceOid = CeCreateDatabaseEx(&m_ceGuid,&ceDbInfo);
if (m_ceOid == 0)//判断创建是否成功
{
AfxMessageBox(_T("创建数据库失败"));
//此处得卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
}
return ;
}
打开数据库
CeOpenDatabase()函数用于打开对象存储库中的数据库
CeOpenDatabaseEx()函数用于打开存储在数据库卷中的数据库
HANDLE m_hDB; //存储数据库句柄,CeOpenDatabaseEx()返回
const LPTSTR DBTABLENAME = _T("Student");//定义数据库名
m_hDB = CeOpenDatabaseEx(&m_ceGuid,&m_ceOid,DBTABLENAME,NULL,CEDB_AUTOINCREMENT,NULL);
if (m_hDB == INVALID_HANDLE_VALUE)//打开失败寻找原因
{
//如果数据库不存在,则新建
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{新建数据库}
新建数据库后接着要打开数据库;
打开失败则卸载数据库卷,并返回;
}
else
{
打开失败则卸载数据库卷,并返回;
}
查找或移动记录
添加记录(写记录)
tmpCeOid = CeWriteRecordProps(m_hDB,0,4,pProps);
CEOID tmpCeOid; //表中记录对象标识
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//学号
//定义学生学号字段标识
//#define PID_NO MAKELONG(CEVT_LPWSTR,1)//CEVT_LPWSTR为字段数据类型
//#define MAKELONG(a, b) ((LONG)( ((WORD)(a)) | ( (DWORD)((WORD)(b)) ) << 16 ))
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NO; //字段标识
pProps->val.lpwstr = stu.szNo;//0结构的Unicode字符串,根据字段的类型选用相应赋值
//姓名
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NAME ;
pProps->val.lpwstr = stu.szName;
//日期
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = stu.ftBirthday;
//学生身高
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = stu.iStature;
pProps = pProps -3 ;
//写记录函数,第二个参数为写入记录标识,0表示添加一条新记录
//第三个参数表写入字段个数和pProps数组长度
tmpCeOid = CeWriteRecordProps(m_hDB,0,4,pProps);
if (tmpCeOid == 0)
{
return false;
}
return true;
}
关闭数据库
//1、关闭数据库
if (!CloseHandle(m_hDB)
{
AfxMessageBox(_T("关闭数据库失败"));
return;
}
//2、将数据库卷的数据缓冲到永久存储介质上
if (!CeFlushDBVol(&m_ceGuid))
{
AfxMessageBox(_T("缓冲介质失败"));
return ;
}
//3、卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
return ;
}
删除数据库
CeDeleteDatabase(m_ceOid);//删除对象库中的数据库
CeDeleteDatabaseEx(&m_ceGuid,m_ceOid);//删除数据库卷中的数据库
列举数据库,获得其信息
hEnumDB=CeFindFirstDatabaseEx(pceguid,0);
CeOid=CeFinfNextDatabaseEx(hEnumDB,pceguid);
TCHAR szMsg[100];//错误信息
HANDLE hEnumDB; //列举数据库句柄
CEOID CeOid; //数据库对象标识
PCEGUID pceguid = NULL;//数据库卷标识
CEOIDINFO CeObjectInfo;//数据库对象基本信息
//列举(查找)所有数据库卷及数据库卷中的所有数据库
hEnumDB=CeFindFirstDatabaseEx(pceguid,0);
if (hEnumDB == INVALID_HANDLE_VALUE)//列举失败
{if(GetLastError()==ERROR_OUTOFMEMORY)
{wsprintf(szMsg,TEXT("OUT OF MEMORY."));}
return;
}
while((CeOid=CeFinfNextDatabaseEx(hEnumDB,pceguid))!=0)
{ //得到数据库信息
if(!CeOidGetInfoEx(pceguid,CeOid,&CeObjectInfo))
{ //获取信息失败
CloseHandle(hEnumDB);//关闭查找句柄
return;
}
else{wsprintf(szMsg,TEXT("The name of the database is: %s"),CeObjectInfo.infDatabase.szDbaseName);}
}
int iCount = oidinfo.infDatabase.wNumRecords;//获取数据库的记录数目
CloseHandle(hEnumDB);//关闭查找句柄
把数据库存储在文件中,就要用数据库卷,先打开或者新建数据库卷,关闭数据库后,还要卸载数据库卷
先装配(打开或新建)数据库卷
CEGUID m_ceGuid; //存储数据库文件卷标识(GUID)PCEGUID m_pCeGuid;
const LPTSTR DBFILENAME = _T("\\My Documents\\abc.db");//数据库文件名
//挂载数据库卷,OPEN_ALWAYS表示如果存在则打开,不存在,就新建一个数据库卷
if (!CeMountDBVol(&m_ceGuid,DBFILENAME,OPEN_ALWAYS))
{
AfxMessageBox(_T("打开或新建数据卷失败"));
return FALSE;
}
//了解系统中已装配好的数据库卷的信息
TCHAR szVolumeName[128];
CREATE_INVALIDGUID(&m_ceGuid);//首次使用时用该宏将&m_ceGuid设为无效。
while(CeEnumDBVolumes(&m_ceGuid,szVolumeName,sizeof(szVolumeName)))
{
AfxMessageBox(szVolumeName);
}
创建数据库
CeCreateDatabase()函数只能创建存放在对象存储库中的数据库
CeCreateDatabaseEx()函数除有以上函数功能外,可以创建存放在数据库卷中的数据库
const LPTSTR DBTABLENAME = _T("Student");//定义数据库名
CEOID m_ceOid; //DWORD型 存储数据库对象标识和记录对象标识,惟一标识数据库的ID,CeCreateDatabaseEx()返回
//在对象存储库外创建一个数据库
CEDBASEINFO ceDbInfo;//用来描述被创建的数据库名称、类型、排序方式以及数据库特征等信息
ceDbInfo.dwFlags = CEDB_VALIDNAME | CEDB_VALIDTYPE | CEDB_VALIDSORTSPEC ;
wcscpy(ceDbInfo.szDbaseName , DBTABLENAME);
ceDbInfo.dwDbaseType = 0;
ceDbInfo.wNumSortOrder = 2 ; //排序字段数目
ceDbInfo.rgSortSpecs[0].propid = PID_NO;
ceDbInfo.rgSortSpecs[0].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小写无关
ceDbInfo.rgSortSpecs[1].propid = PID_NAME;
ceDbInfo.rgSortSpecs[1].dwFlags = CEDB_SORT_CASEINSENSITIVE; //升序,且大小写无关
m_ceOid = CeCreateDatabaseEx(&m_ceGuid,&ceDbInfo);
if (m_ceOid == 0)//判断创建是否成功
{
AfxMessageBox(_T("创建数据库失败"));
//此处得卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
}
return ;
}
打开数据库
CeOpenDatabase()函数用于打开对象存储库中的数据库
CeOpenDatabaseEx()函数用于打开存储在数据库卷中的数据库
HANDLE m_hDB; //存储数据库句柄,CeOpenDatabaseEx()返回
const LPTSTR DBTABLENAME = _T("Student");//定义数据库名
m_hDB = CeOpenDatabaseEx(&m_ceGuid,&m_ceOid,DBTABLENAME,NULL,CEDB_AUTOINCREMENT,NULL);
if (m_hDB == INVALID_HANDLE_VALUE)//打开失败寻找原因
{
//如果数据库不存在,则新建
if (GetLastError() == ERROR_FILE_NOT_FOUND)
{新建数据库}
新建数据库后接着要打开数据库;
打开失败则卸载数据库卷,并返回;
}
else
{
打开失败则卸载数据库卷,并返回;
}
查找或移动记录
添加记录(写记录)
tmpCeOid = CeWriteRecordProps(m_hDB,0,4,pProps);
CEOID tmpCeOid; //表中记录对象标识
CEPROPVAL *pProps;
pProps = new CEPROPVAL[4];
//学号
//定义学生学号字段标识
//#define PID_NO MAKELONG(CEVT_LPWSTR,1)//CEVT_LPWSTR为字段数据类型
//#define MAKELONG(a, b) ((LONG)( ((WORD)(a)) | ( (DWORD)((WORD)(b)) ) << 16 ))
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NO; //字段标识
pProps->val.lpwstr = stu.szNo;//0结构的Unicode字符串,根据字段的类型选用相应赋值
//姓名
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_NAME ;
pProps->val.lpwstr = stu.szName;
//日期
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_BIRTHDAY;
pProps->val.filetime = stu.ftBirthday;
//学生身高
pProps++;
memset(pProps,0,LocalSize(pProps));
pProps->propid = PID_STATURE;
pProps->val.iVal = stu.iStature;
pProps = pProps -3 ;
//写记录函数,第二个参数为写入记录标识,0表示添加一条新记录
//第三个参数表写入字段个数和pProps数组长度
tmpCeOid = CeWriteRecordProps(m_hDB,0,4,pProps);
if (tmpCeOid == 0)
{
return false;
}
return true;
}
关闭数据库
//1、关闭数据库
if (!CloseHandle(m_hDB)
{
AfxMessageBox(_T("关闭数据库失败"));
return;
}
//2、将数据库卷的数据缓冲到永久存储介质上
if (!CeFlushDBVol(&m_ceGuid))
{
AfxMessageBox(_T("缓冲介质失败"));
return ;
}
//3、卸载数据库卷
if (!CeUnmountDBVol(&m_ceGuid))
{
AfxMessageBox(_T("卸载数据库文件卷失败"));
return ;
}
删除数据库
CeDeleteDatabase(m_ceOid);//删除对象库中的数据库
CeDeleteDatabaseEx(&m_ceGuid,m_ceOid);//删除数据库卷中的数据库
列举数据库,获得其信息
hEnumDB=CeFindFirstDatabaseEx(pceguid,0);
CeOid=CeFinfNextDatabaseEx(hEnumDB,pceguid);
TCHAR szMsg[100];//错误信息
HANDLE hEnumDB; //列举数据库句柄
CEOID CeOid; //数据库对象标识
PCEGUID pceguid = NULL;//数据库卷标识
CEOIDINFO CeObjectInfo;//数据库对象基本信息
//列举(查找)所有数据库卷及数据库卷中的所有数据库
hEnumDB=CeFindFirstDatabaseEx(pceguid,0);
if (hEnumDB == INVALID_HANDLE_VALUE)//列举失败
{if(GetLastError()==ERROR_OUTOFMEMORY)
{wsprintf(szMsg,TEXT("OUT OF MEMORY."));}
return;
}
while((CeOid=CeFinfNextDatabaseEx(hEnumDB,pceguid))!=0)
{ //得到数据库信息
if(!CeOidGetInfoEx(pceguid,CeOid,&CeObjectInfo))
{ //获取信息失败
CloseHandle(hEnumDB);//关闭查找句柄
return;
}
else{wsprintf(szMsg,TEXT("The name of the database is: %s"),CeObjectInfo.infDatabase.szDbaseName);}
}
int iCount = oidinfo.infDatabase.wNumRecords;//获取数据库的记录数目
CloseHandle(hEnumDB);//关闭查找句柄