Posted on 2007-03-28 16:45
宋鵬 閱讀(1399)
評論(0) 編輯 收藏 引用 所屬分類:
數(shù)據(jù)庫
隨著掌上電腦的迅速崛起,微軟推出的運行在掌上電腦上的操作系統(tǒng)Windows?CE越來越引人矚目。
Windows?CE包括一個Win32?API子集,一個適宜于靜態(tài)、動態(tài)內(nèi)存存儲的文件系統(tǒng)等。根據(jù)需要,還增加了一些Windows所沒有的特性,增加了一些新的API(包括一些新的數(shù)據(jù)庫API)。其中數(shù)據(jù)庫被定位在對象存儲(Object?Store)中。對象存儲是掌上電腦內(nèi)存的一部分,是操作系統(tǒng)分配來存儲永久文件、注冊表、Windows?CE?數(shù)據(jù)庫的。掌上電腦剩余的內(nèi)存是應用程序內(nèi)存,供應用程序使用。
Windows?CE中用來操作數(shù)據(jù)庫的函數(shù)有:打開數(shù)據(jù)庫CeOpenDatabase();?關(guān)閉數(shù)據(jù)庫CloseHandle();?刪除紀錄CeDeleteRecord等。
Windows?CE上數(shù)據(jù)庫的一些附加特性也是很有意思的,如數(shù)據(jù)庫支持“time?stamps”,這個特性讓開發(fā)者可以測試自上次讀數(shù)據(jù)后是否有別的程序修改了數(shù)據(jù)。
下面讓我們詳細介紹Windows?CE上的數(shù)據(jù)庫編程(開發(fā)工具:VC?5.0,WindowsCE?ToolKit?for?VC?5.0)。
?基本數(shù)據(jù)庫操作
1.創(chuàng)建數(shù)據(jù)庫
void?CMyDB::CreateDatabase()
{
?CCeDBDatabase?db;
?//?檢查數(shù)據(jù)庫是否存在
?if(!CCeDBDatabase::Exists(_T("My?Database")))?
?{
?//如果數(shù)據(jù)庫不存在,就創(chuàng)建它
?db.Create(_T("My?Database"));
?}?
}
2.打開數(shù)據(jù)庫
CCeDBDatabase?db;
db.Open(_T(″My?Database″));?
3.刪除數(shù)據(jù)庫
CCeDBDatabase?db;?
if?(db.Open(_T(″My?Database″)))?
?db.Delete();
4.關(guān)閉數(shù)據(jù)庫
CCeDBDatabase?db;?
db.Open(_T(″My?Database″));
db.Close();
向數(shù)據(jù)庫中加入紀錄
這里我向大家介紹另兩個數(shù)據(jù)庫類:CCeDBRecord,CCeDBProp。
創(chuàng)建數(shù)據(jù)庫時,我們可以同時定義字段,然后設(shè)置紀錄變量的各字段值,最后將記錄加入到數(shù)據(jù)庫中。
?//?Create?database
?const?DWORD?DB_IDENT_ID?=?11111;
?const?WORD?PROP_NAME=101,PROP_AGE=102,PROP_GENDER=103;
?CCeDBDatabase?db?;
?CEOID?poid;?
?CCeDBProp?dbprops[3]?=?{
?CCeDBProp(CCeDBProp::Type_String,PROP_NAME,CCeDBProp::Sort_Ascending),
?CCeDBProp(CCeDBProp::Type_UShort,PROP_AGE,CCeDBProp::Sort_Descending),
?CCeDBProp(CCeDBProp::Type_UShort,PROP_GENDER,CCeDBProp::Sort_UnknownFirst)?
?};
?if(!(poid?=?db.Create((_T("My?DB"),DB_IDENT_ID,3,dbprops)))?
?return?FALSE;
?if(!db.Open(poid))?return?FALSE;
?//?Add?records
?CCeDBRecord?rec;
?CCeDBProp?props[3];?
?props[0]?=?CCeDBProp(_T("LiMing"),PROP_NAME);
?props[1]?=?CCeDBProp((USHORT)20,?PROP_AGE);
?props[2]?=?CCeDBProp((USHORT)'M',PROP_GENDER);
?rec.AddProps(props,3);
?if(!db.AddRecord(&rec))?return?FALSE;
從數(shù)據(jù)庫中檢索紀錄
我們可以通過調(diào)用CCeDBDatabase::GetNumRecords()獲取紀錄數(shù)。通過CCeDBDatabase::GetCurrRecord()獲取每個紀錄的指針。
?BOOL?bPrev?=?pdb-〉m_bAutoSeekNext;
?pdb-〉m_bAutoSeekNext?=?TRUE;
?pdb-〉SeekFirst();
?while(pdb-〉ReadCurrRecord(&rec))
?MyPrintRecord(&rec);//處理數(shù)據(jù)(顯示記錄)
?pdb-〉m_bAutoSeekNext?=?bPrev;
通過調(diào)用CCeDBRecord::GetPropFromIdent()獲取每個字段值。
?pPropName=prec-〉GetPropFromIdent(PROP_NAME);
?LPWSTR?strName=pPropName-〉GetString();
除了可以遍歷數(shù)據(jù)庫紀錄外,還可按條件查找紀錄,如:查找具有指定屬性的記錄。
CCeDBProp?prop;
?....//設(shè)置待查找紀錄的屬性
?db.SeekFirstEqual(&prop);
?從數(shù)據(jù)庫中刪除紀錄
//先查找指定紀錄
db.DeleteCurrRecord();
?修改數(shù)據(jù)庫中紀錄
?CCeDBRecord?rec;
?....//查找待修改的記錄
?....//修改記錄的屬性?