Welcome to tiger's blog!

What lead to success, what we are seeking...
posts - 47, comments - 23, trackbacks - 0, articles - 8
   :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理

WinCE数据库之CCeDBDatabase

Posted on 2007-01-09 11:38 tiger 阅读(1942) 评论(7)  编辑 收藏 引用

        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();

Feedback

# re: WinCE数据库之CCeDBDatabase[未登录]  回复  更多评论   

2007-04-12 17:15 by RAINBOW
我照你的代码做,但是会提示:
E:\wince学习\database\exercise\test\testDlg.cpp(85) : error C2065: 'PROP_NO' : undeclared identifier
E:\wince学习\database\exercise\test\testDlg.cpp(86) : error C2065: 'PROP_Name' : undeclared identifier
E:\wince学习\database\exercise\test\testDlg.cpp(87) : error C2065: 'PROP_Age' : undeclared identifier
E:\wince学习\database\exercise\test\testDlg.cpp(92) : error C2065: 'DB_IDENT_ID' : undeclared identifier
Error executing cl.exe.
为什么啊?

# re: WinCE数据库之CCeDBDatabase[未登录]  回复  更多评论   

2007-04-12 17:45 by RAINBOW
这四个'PROP_NO','PROP_Name' ,'PROP_Age' ,'DB_IDENT_ID' 的定义怎么写呢?越详细越好!我是菜鸟!请多指教!

# re: WinCE数据库之CCeDBDatabase  回复  更多评论   

2007-04-13 09:23 by tiger
这个分别是数据库字段及数据库表的索引。WinCE中数据库及数据库字段需要自己定义索引,与NT下面不同,但是你不能定义重复的索引号。例如你可以如下定义:
const DWORD DB_IDENT_ID = 11111;
const WORD PROP_NO = 101;
const WORD PROP_Name=102;
const WORD PROP_Age=103;

# re: WinCE数据库之CCeDBDatabase[未登录]  回复  更多评论   

2007-04-14 15:35 by RAINBOW
谢谢回复!
请问你这些代码是放在哪里使用?是建一个对话框吗?还是SDI?
我建了一个对话框,上面放了几个BUTTON,分别用来找开,新增,删除,编辑数据库,然后把你的代码拷过来,在新增时提示m_Name,m_No,m_Age没有定义,我把这三个做为对话框的三个成员变量,但是我不知道还要做哪些处理?
编辑时会提示:
E:\wince学习\database\exercise\cedbdatabase\cedbdatabaseDlg.cpp(193) : warning C4101: 'tempProp' : unreferenced local variable
E:\wince学习\database\exercise\cedbdatabase\cedbdatabaseDlg.cpp(238) : error C2065: 'm_CtrlList' : undeclared identifier
E:\wince学习\database\exercise\cedbdatabase\cedbdatabaseDlg.cpp(238) : error C2228: left of '.GetFirstSelectedItemPosition' must have class/struct/union type
E:\wince学习\database\exercise\cedbdatabase\cedbdatabaseDlg.cpp(239) : error C2228: left of '.GetNextSelectedItem' must have class/struct/union type
E:\wince学习\database\exercise\cedbdatabase\cedbdatabaseDlg.cpp(241) : error C2228: left of '.GetItemText' must have class/struct/union type
Error executing cl.exe.
请帮忙啊?能麻烦你一步一步的教教我吗?谢谢啦?
创建数据库成功,为什么找不到数据库文件呢?

# re: WinCE数据库之CCeDBDatabase[未登录]  回复  更多评论   

2007-04-14 17:22 by tiger
'tempProp' : unreferenced local variable 是说变量tempProp没有使用,也许是我写这段代码的时候太匆忙了,所以没有注意这个,不好意思^_^
这段代码我是在基于对话框的程序里面做的,但是移植到文档里面也是没问题的,在什么程序里面实现没问题,关键是实现的方法。
因为我在对话框中用到了一个CListCtrl控件来用于显示数据,而你没有定义那个控件,所以才会有以下的错误。
你在什么环境下面运行这个程序?是虚拟机、还是WinCE下面呢?一般在根目录下面的Database文件夹下面会生成一个数据库文件的。

# re: WinCE数据库之CCeDBDatabase[未登录]  回复  更多评论   

2007-04-16 10:54 by RAINBOW
我用的是WINCE,但是我在Windows CE Remote File Viewer里根本没发现database文件夹?

# re: WinCE数据库之CCeDBDatabase  回复  更多评论   

2007-04-16 11:21 by tiger
好像在真正的WinCE设备上面没有这个文件夹的,而且WinCE中对数据库的操作都是基于内存的,用这种方式创建的数据库数据重启以后将全部丢失,建议不要使用这种方式。在虚拟机上面的Database文件夹下面可以看到此数据库文件的。

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理