背景
进行Windows Mobile的应用的开发,很多时候需要对数据库进行访问,存储和读取。可是微软没有为Native C++提供象ADO.NET下的封装,所以我自己封装了一个SqlCe访问类。
简述
本文讲述在Windows Mobile和Wince下,Native C++访问SqlCe的封装类的实现。由于微软没有为C++提供像ADO.NET的封装,为Native C++访问SqlCe制造了一定的难度,因此对OleDB访问SqlCe进行封装,方便使用SQL语句对SqlCe进行操作。
SqlCe访问技术概述ADO.NET
.NET Compact Framework逐渐成为Windows Mobile和Wince的开发的主流,微软为CF.NET提供了ADO.NET访问SqlCe,对SqlCe的访问封装在System.Data.SqlServerCe下,和其他数据库(SQL Server, Oracle)访问基本兼容,但是不支持DbProviderFactory。例如下面的代码不能通过编译,因为没有SqlCeProviderFactory类。
DbProviderFactory factory = SqlCeProviderFactory.Instance;
我之前封装了一个ADO.NET的SqlCe访问类,可以参考 .NET Compact Framework下SQL CE的使用(http://www.cnblogs.com/procoder/archive/2009/04/08/1431361.html)和 实现了SqlCeHepler的单元测试类见.NET Compact Framework下的单元测试(http://www.cnblogs.com/procoder/archive/2009/04/08/1431724.html)。
OleDb
在Native的世界,可以通过OleDb来访问SqlCe。OleDb封装在sqlceoledb35.dll下,使用OleDb需要安装一个Cab包如下:
C:\Program Files\Microsoft SQL Server Compact Edition\v3.5\Devices\wce500\armv4i\sqlce.repl.ppc.wce5.armv4i.CAB
上述路径根据平台有所不同。
注意上述sqlceoledb35.dll只是支持SqlCe 3.5,微软对不同版本的SqlCe的兼容性不是很好,可以参考 SQL Server Express和SQL Server Compact的应用(http://www.cnblogs.com/procoder/archive/2009/02/23/1396231.html)和 .NET Campact Framework下SQL CE兼容性问题(http://www.cnblogs.com/procoder/archive/2009/04/15/1436275.html)了解SqlCe的历史我兼容性问题。
本文后续会重点讲述OleDb。
ADO
在Windows Mobile和Wince平台,微软官方不支持ADO。但是有一个社区实现,可以参考 A set of ADOCE classes(http://www.codeproject.com/KB/mobile/ado_ce_ca.aspx)。我没有试过,所以不好评论。
实现
下面讲述如何基于OleDb实现对SqlCe的访问。
文档和Samples
微软提供了在线文档,可以在 Microsoft SQL Server Compact 3.5 Books Online and Samples(http://www.microsoft.com/downloads/details.aspx?FamilyID=1ff0529a-eb1f-4044-b4b7-40b00710f7b7&displaylang=en)下载。上述链接只是包含在线文档,没有提供例子程序的,所以这个名字有点骗人感情之嫌。虽然提供了在线文档,但是文档的质量不高,有些细节没讲,例如调用ICommand::Execute的入口参数就没有讲,我做的时候只能自己试。
虽然上面的链接不提供Samples,但是我们还有另外一个方法取得Samples。在
C:\Program Files\Microsoft SQL Server 2005 Mobile Edition\Samples\NorthwindOleDb
下可以得到Sample代码,前提是安装了Microsoft SQL Server 2005 Mobile Edition。但是要注意不同SqlCe版本实现有所不同,这个代码要结合上面的Online book修改才行。