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