用WinCE内嵌的数据库做个存储短信的程序,犯了许多错误,
小记下:
1:定义属性
#define pidPhoneNo MAKELONG(CEVT_LPWSTR,2)
或者
const CEPROPID pidPhoneNo = MAKELONG(CEVT_LPWSTR,2);
2:创建数据库
CEDBASEINFO结构体的wNumSortOrder最大为4
windbase.h 头文件中
#define __CEDB_MAXSORTORDER 4
CEDBASEINFO结构中wNumSortOrder定义
WORD wNumSortOrder; //@field Number of sort orders active in the database
// Maximum is CEDB_MAXSORTORDER.
个人理解是需要进行排序的属性数,最多4个属性进行排序,不是指一个记录只能有4个属性
个人程序中只用一个属性进行排序,其他属性不排序,貌似不超过最大属性字节限制,可以任意多个属性。
ceDBinfo.rgSortSpecs[0].propid=pidTime;
ceDBinfo.rgSortSpecs[0].dwFlags=CEDB_SORT_DESCENDING|CEDB_SORT_CASEINSENSITIVE; //降序,忽略大小写
3:输出记录时属性的输出次序
CEOID ceOid;
WORD wProps;
DWORD dwRecSize;
PBYTE pBuff =0;
PCEPROPVAL pRecord;
ceOid = CeSeekDatabase(m_hDB,CEDB_SEEK_BEGINNING,k,NULL);
ceOid = CeReadRecordProps(m_hDB,CEDB_ALLOWREALLOC,&wProps,NULL,&(LPBYTE)pBuff,&dwRecSize);
pRecord=(PCEPROPVAL)pBuff;
for(int i=0;i<wProps;i++)
{
//以本人程序例子,wProps=4,4个属性 输出的顺序与写入注册表时一样
//如果某条记录写入的时候是:姓名、号码、内容、时间,则输出这条记录的时候是:姓名、号码、内容、时间
//如果某条记录写入的时候是:时间、号码、姓名、内容,则输出这条记录的时候是:时间、号码、姓名、内容
//在同一个数据库中,可以混着用任意顺序
}
4:返回数据库记录数
CEOIDINFO oidInfo;
if (!CeOidGetInfoEx(&m_ceGuid,m_ceOid,&oidInfo))
{
TRACE(_T("获取数据库记录数失败 err/n"));
}
现在看多么顺利的一句话,因为在if那句后面多写了个分号,折腾了小一天,悲催!
5:记录中属性的数据类型
所有属性均用
CEVT_LPWSTR类型
程序中用CString
存储的时候转化:例 内容属性
TCHAR content[256];
lstrcpy(content,sm.szContent);//szContent是CString类型
pProps->val.lpwstr=content;
输出时转为CString:pSM->szContent=pRecord->val.lpwstr;