嵌入式数据库SQLCE的开发与应用

               WINCE 自带数据库系统

WINCE 提供一种简单的数据库系统,由于该数据库系统最多只能支持 4 种排序索引,因此使用它只能组织一些简单的数据库,如通讯簿,邮件等。 在较老的 WINCE 版本中,数据库只能驻留在对象存储库中,而不能存储在外部介质中。从 WINCE2.1 版本之后,通过引入卷的概念后,就可以将数据库存储在外部介质中了。

l          何为数据库卷?

数据库卷是可以存储 WINCE 数据库的特殊格式的文件。在 WINCE 中,如果想把数据库存储在文件中或则需要随意拷贝或删除数据库文件,就需要使用数据库卷。

  与数据库卷对应的是对象存储库,在 WINCE2.1 以前的版本中数据库都是存放在对象存储库中的,对象存储库不支持拷贝,删除。

l          到这里我觉得有必要谈谈数据库的基本的一个结构,让我们来看看一张具体的图片我们就能了解到 WINCE 数据库的结构了。这里我们主要谈到的是字段和记录!

                 

 

就这张图而言, Title Rating 就是字段,而每一行就是一条记录。在 WINCE 中字段的类型有九种:

数据类型

说明

对应常量

iVal

两个字节的有符号整数

CEVT_I2

  uiVal

两个字节的无符号整数

CEVT_UI2

  lVal

4 个字节有符号整数

CEVT_I4

  ulVal

4 个字节的无符号整数

CEVT_UI4

filetime

日期时间结构

CEVT_FILETIME

  lpwstr

0 结束的 Unicode 字符串

CEVT_LPWSTR

blob

CEBLOB 结构,这里可以用来存储大对象,例如图片或声音文件等

CEVT_BLOB

  BoolVal

布尔值

CEVT_BOOL

  dblVal

8 个字节的有符号值

CEVT_R8

这些字段在你设计自己的数据库时会有帮助。

l          数据库的操作流程:

 

1 步:装配数据库卷(如果针对对象存储库,该步骤可以省略)

BOOL CeMountDBVol(

PCEGUID pceguid,  // 数据库卷的标识

LPWSTR  lpszDBVol,// 数据库文件的路径

DWORD   dwFlags);// 表示数据库卷被装载的方式(dwFlags 的具体的使用请查看MSDN

 

2 步:打开数据库(如果不存在就创建一个需要的数据库)

针对对象存储库中的数据库

HANDLE CeOpenDatabase(

PCEOID poid, // 要被打开的数据库ID 如果使用数据库名称打开数据库,应该将poid 设置成0

LPWSTR lpszName ,// 要被打开的数据库名称,如果参数poid 设置非0 ,那么该参数被忽略

CEPROPID propid,// 制定打开时使用那种次序来排序数据库

DWORD dwFlags,// 取值0CEDB_AUTOINCREMENT. 如果指定的是0 那么每次从数据库中读取一条记录数据库当前记录指针不会移动。如果是CEDB_AUTOINCREMENT 表示读一次,当前记录指针会移动到下一条记录。

HWND  hwndNotify);// 表示当另一个进程或线程更改数据库时要通知的窗口句柄。

如果针对数据库卷使用

HANDLE CeOpenDatabaseEx(

    PCEGUID pceguid, // 已经装配的数据卷标示

  PCEOID poid,

  LPWSTR lpszName,

  CEPROPID propid,

  DWORD dwFlags,

  CENOTIFYREQUEST* pReq // 数据库更改消息(关于消息的结构可以参考MSDN

注:这里有必要提到一点的是在使用PCEOID poid 这个参数时,如果你想使用数据库名称打开就必须把poid0 ,但是置0 不等于可以直接把 填上去。

例如:HANDLE CeOpenDatabaseEx pceguid0 lpszName,propid, dwFlags, pReq )就是一个错误的操作!

 

3 步:通过使用 CeSeekDatabase 移动记录的指针。

CEOID CeSeekDatabase(

  HANDLE hDatabase, // 需要SEEK 的数据库句柄

  DWORD dwSeekType, //SEEK 记录的类型

  DWORD dwValue, // 从第dwValue 条记录开始

  LPDWORD lpdwIndex);// 返回索引的值

注:对空的记录是不能SEEK 的,如果使用就会造成错误

 

4 步:执行数据的存取操作

通过 CeReadRecordProps (CEDB) CeWriteRecordProps (CEDB) 进行记录的读写操作,还有删除记录等操作,我这里重点介绍一下常用的两个,即读和写操作!

CEOID CeReadRecordProps(

  HANDLE hDbase,      // 数据库句柄

  DWORD dwFlags,     // 读取标识

  LPWORD lpcPropID, // 字段的数量

  CEPROPID* rgPropID, // 指向CEPROPID 结构的数组,表示需要读取的字段,如果为空表示读取所有字段

  LPBYTE* lplpBuffer, // 存储记录的信息

  LPDWORD lpcbBuffer); 表示lplpBuffer 缓冲区的大小

 

CEOID CeWriteRecordProps(

  HANDLE hDbase,

  CEOID oidRecord, // 记录的ID

  WORD cPropID,    // 需要写的字段数量

  CEPROPVAL* rgPropVal);// 写入的记录信息

注:在写一条新记录的时候应该把 CEOID oidRecord 0

 

5 步:关闭数据库的句柄,卸载卷!

 

注:数据操作的所有函数通过这个链接都可以找到。

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wcedata5/html/wce50grfDatabaseFunctions.asp

 

l          关于数据库的枚举

    // 查找对象存储库中的所有数据库

    hEnumDB = CeFindFirstDatabase (0);

    if (hEnumDB ==INVALID_HANDLE_VALUE )

    {

        if (GetLastError ()==ERROR_OUTOFMEMORY )

            wsprintf (szMsg ,_T ("Out of memory." ));

        else

           wsprintf (szMsg ,_T ("Unknown error." ));

       return false ;

    }

   

    while ((CeOid =CeFindNextDatabase (hEnumDB ))!=0)

    {

        // 得到数据库的信息

        if (!CeOidGetInfo (CeOid ,&CeObjectInfo ))

        {

            CloseHandle (hEnumDB );

            return false ;

      }

    else

 {

  根据自己的需要的对找的数据库进行操作;

 }

  如果是遍历卷中的数据库只需要把      

 CeFindFirstDatabase 换成CeFindFirstDatabaseEx(),

 CeFindNextDatabase 换成CeFindNextDatabaseEx (),

 再根据不同的参数要求改变一下即可!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值