引子
上一篇 (SQL Server、Oracle、db2所提供的简装版(Express)比较) 我针对在应用程序开发中,可能会用到的三款数据库产品的简装版做了一些介绍和比较。如果我们的应用的数据量不是很大,例如不超过4GB,而且用户的并发情况也不多的话,它们是不错的选择。但有一个问题就是,他们都需要在运行环境中,安装相应的数据库引擎,而且相对来说,所占用的内存还不小。如果我们这个应用是一个针对个人用户或者要在终端用户的桌面上运行的的,那么就可能遇到一个部署的障碍。大家试想一下,有多少人愿意在自己的日常工作的电脑上面安装这样的数据库引擎呢?尤其是他们对这些东西又不熟悉的情况下。你可能会苦口婆心地去跟用户解释,动之以情,晓之以理……不过,请打住,用户会跟你说:“Don’t make me think”,
SQL Server CE:全称叫SQL Server Compact Edition。这是从SQL Server 2005开始提供的一个特殊版本。原本叫SQL Server Mobile Edition,顾名思义,是定位用在手机开发中的。不过,期间又改过几次名字,我们就不要深究了。目前而言,这个版本可以用于一些脱机的、本地的存取,它继承了SQL Server的优良传统,提供了与SQL Server一致性的访问体验,并且这个数据库可以很容易地与服务器端的SQL Server实现同步。你可以通过微软官方网站了解更多或者进行下载:http://www.microsoft.com/downloads/zh-cn/details.aspx?familyid=85E0C3CE-3FA1-453A-8CE9-AF6CA20946C3&displaylang=zh-cn
SQL Server CE
如果你本来就比较熟悉SQL Server,并且希望你的这个程序,可以与服务器端实现数据同步,那么你应该优先选用SQL Server CE。
需要注意的是,Local Database Cache是一个特殊的模板,它可以结合Sync Framework实现与服务器端数据库的同步
我们先来看一下简单的Local Database的做法,通过模板创建一个sdf文件之后,双击它,就会自动打开Server Explorer
在这里,你可以像在服务器一样,添加表(注意,只能添加表,没有其他对象,例如视图,存储过程等)
访问SQL Server CE的数据库,实在太简单了。我们可以用ADO.NET Entity Framework来快速建模和访问。注意,它不支持LINQ to SQL.
在应用程序中,你可以通过如下的方式对数据进行查询
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplicationSample
{
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);
//使用LINQ to Entities访问SQL Server CE数据库
//1.创建数据库上下文
var ctx = new UsersEntities();
//2.构造查询
var query = from u in ctx.Employees
where u.Email.Contains("xizhang")
select u;
//3.得到结果
var result = query.ToArray();
//4.执行其他操作(绑定,或者遍历)
}
}
}
通过如下的方式对数据库进行修改,例如新增,删除,更新等
using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
namespace WindowsFormsApplicationSample
{
static class Program
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main()
{
Application.EnableVisualStyles();
Application.SetCompatibleTextRenderingDefault(false);