用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;