【转】WinCE数据库之CCeDBDatabase

 CCeDBDatabase类提供一系列api函数以操作WinCE下的数据库文件*.db,不过该数据库文件一般由系统自动创建于Database文件夹下面,该文件保存于内存中,仪器重启即丢失。此方式可用于数据量大且短期需要保存数据的系统。其操作具体如下所示:
1、定义数据库对象:
  CCeDBDatabase db;

2、创建数据库:
// Create database
 CCeDBProp dbprops[3] =
 {
  CCeDBProp(CCeDBProp::Type_String,PROP_NO,CCeDBProp::Sort_Ascending),
   CCeDBProp(CCeDBProp::Type_String,PROP_Name,CCeDBProp::Sort_Ascending),
  CCeDBProp(CCeDBProp::Type_UShort,PROP_Age,CCeDBProp::Sort_Ascending)
 };
 if(!CCeDBDatabase::Exists(_T("Student.db")))
 {
  db.Create(_T("Student.db"),DB_IDENT_ID,3,dbprops);
 }

3、新增记录:
UpdateData(true);
 if(!db.Open(_T("Student.db")))
 {
  MessageBox(_T("Database open Error!"));
  return;
 }
 CCeDBProp props[3];
 CCeDBRecord rec;
 props[0] = CCeDBProp((LPWSTR)(LPCTSTR)m_No,PROP_NO);
 props[1] = CCeDBProp((LPWSTR)(LPCTSTR)m_Name, PROP_Name);
 if(db.SeekFirstEqual(props[1]))
 {
  MessageBox(_T("tiger"));
  db.Close();
  return;
 }
 props[2] = CCeDBProp((USHORT)m_Age,PROP_Age);
 rec.AddProps(props,3);
 if(!db.AddRecord(&rec))
 {
  MessageBox(_T("Add Record Error!"));
  return;
 }
 db.Close();

4、编辑记录:
UpdateData(true);
 if(!db.Open(_T("Student.db")))
 {
  MessageBox(_T("Database open Error!"));
 }

 CCeDBRecord rec;
 CCeDBProp pProp[2];
// pProp[0]=CCeDBProp((LPWSTR)(LPCTSTR)m_No,PROP_NO);
 pProp[0]=CCeDBProp((LPWSTR)(LPCTSTR)m_Name,PROP_Name);
 pProp[1]=CCeDBProp((USHORT)m_Age,PROP_Age);
 rec.AddProps(pProp,2);
 //OK
/* CCeDBProp pProp1[1];
 pProp1[0]=CCeDBProp((LPWSTR)(LPCTSTR)m_No,PROP_NO);
 db.SeekFirstEqual(pProp1[0]);
 db.WriteCurrRecord(&rec);*/
 //修改数据OK
 //////////////////////////
/* BOOL OldSeekNext=db.m_bAutoSeekNext;
 db.m_bAutoSeekNext=true;
 db.SeekFirst();
 CCeDBRecord temprec;
 CCeDBProp* tempProp;
 CString strNO,strName;
 while(db.ReadCurrRecord(&temprec))
 {
  tempProp=temprec.GetPropFromIdent(PROP_NO);
  strNO=tempProp->GetString();
  tempProp=temprec.GetPropFromIdent(PROP_Name);
  strName=tempProp->GetString();
  if((strNO == m_No)&&(strName == m_Name))
  {
   if(db.m_bEOF)
    db.SeekLast();
   else
    db.SeekPrev();
   db.WriteCurrRecord(&rec);
   break;
  }
 }
 db.m_bAutoSeekNext=OldSeekNext;*/
 ////////////////////////
 //定位记录
 BOOL OldSeekNext=db.m_bAutoSeekNext;
 db.m_bAutoSeekNext=true;
 CCeDBProp AimProp[1];
 AimProp[0]=CCeDBProp((LPWSTR)(LPCTSTR)m_No,PROP_NO);
 if(db.SeekFirstEqual(AimProp[0]))
 {
  CCeDBRecord temprec;
  CCeDBProp *tempProp;
  CString strName;
 // do
//  {
   db.ReadCurrRecord(&temprec);
  // tempProp=temprec.GetPropFromIdent(PROP_Name);
  // strName=tempProp->GetString();

  // MessageBox(strName);
  // if(!db.m_bEOF)
  //  MessageBox(_T("tiger"));

   if(!db.m_bEOF)
    db.SeekPrev();
   db.DeleteCurrRecord();
  /* if(strName == m_Name)
   {
    db.WriteCurrRecord(&rec);
    break;
   }*/
 // }while(db.SeekNextEqual(AimProp[0]));
 }
 db.m_bAutoSeekNext=OldSeekNext;
 /////////////////////////////////////
 db.Close();

5、删除记录:
if(!db.Open(_T("Student.db")))
 {
  MessageBox(_T("Database open Error!"));
 }
 //取得列表中选择的记录
 POSITION pos=m_CtrlList.GetFirstSelectedItemPosition();
 int nItem=m_CtrlList.GetNextSelectedItem(pos);

 CString NO=m_CtrlList.GetItemText(nItem,0);
 CCeDBProp pProp[1];
 pProp[0]=CCeDBProp(NO.GetBuffer(0),PROP_NO);
 db.SeekFirstEqual(pProp[0]);

 ////////////////////
 CCeDBRecord rec;
 db.ReadCurrRecord(&rec);
 CCeDBProp* tempProp;
 tempProp=rec.GetPropFromIdent(PROP_NO);
 CString strNO=tempProp->GetString();
 MessageBox(strNO);
 /////////////////////
 db.DeleteCurrRecord();
 db.Close();

6、遍历记录
m_CtrlList.DeleteAllItems();
 if(!db.Open(_T("Student.db")))
 {
  MessageBox(_T("Database open Error!"));
 }

 CCeDBProp* pProp;
 int nItem=0;
 CString str;
 BOOL bPrev = db.m_bAutoSeekNext;
 db.m_bAutoSeekNext = TRUE;
 db.SeekFirst();
 CCeDBRecord rec;
 while(db.ReadCurrRecord(&rec))
 {
  pProp=rec.GetPropFromIdent(PROP_NO);
  LPWSTR strNO=pProp->GetString();
  m_CtrlList.InsertItem(nItem,strNO);
  pProp=rec.GetPropFromIdent(PROP_Name);
  LPWSTR strName=pProp->GetString();
  m_CtrlList.SetItemText(nItem,1,strName);
  pProp=rec.GetPropFromIdent(PROP_Age);
  USHORT Age=pProp->GetUShort();
  str.Format(_T("%d"),Age);
  m_CtrlList.SetItemText(nItem,2,str);
 }
 db.m_bAutoSeekNext = bPrev;
 db.Close();

 

posted @ 2016-03-06 09:49  91program  阅读(308)  评论(0编辑  收藏  举报