SQL CE数据库搭建和操作
创建新的 SQL Server CE 数据库
- 启动 Visual Studio .NET,然后打开一个新项目。
- 创建对使用的命名空间的引用。
using System;
using System.IO;
using System.Text;
using System.Data;
using System.Data.SqlServerCe;
using System.Collections;
using System.Windows.Forms;
using System.Data.Common;
- 创建 WalkThrough 类。
public class WalkThrough
{
static void Main()
{
SqlCeConnection conn = null;
try
{
- 验证具有您打算使用的名称的数据库是否已存在。
if (File.Exists ("Test.sdf") )
File.Delete ("Test.sdf");
- 使用 System.Data.SqlCeEngine 对象创建名为 Test.sdf 的空数据库。
注意 SQL Server CE 中,数据库名称的文件扩展名为 .sdf。
SqlCeEngine engine = new SqlCeEngine ("Data Source = Test.sdf");
engine.CreateDatabase ();
- 连接到这个新数据库。
conn = new SqlCeConnection ("Data Source = Test.sdf");
conn.Open();
创建新表
- 使用 System.Data.SqlCeCommand 创建命令类的实例。
SqlCeCommand cmd = conn.CreateCommand();
- 运行命令 cmd 创建表。用于创建表的指令必须在 cmd.CommandText 所包含的 SQL 代码中。
若要使用 SQL Server CE 的 SQL 编程语言创建表,请使用 CREATE TABLE 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
cmd.CommandText = "CREATE TABLE TestTbl(col1 int PRIMARY KEY, col2 ntext, col3 money)";
cmd.ExecuteNonQuery();
将数据添加到新表中
- 运行命令以添加数据行。与创建表相同,用于添加行的指令也必须在 cmd.CommandText 所包含的 SQL 代码中。
若要使用 SQL Server CE 的 SQL 编程语言将行添加到表中,请使用 INSERT 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (0, 'abc', 15.66)";
cmd.ExecuteNonQuery();
- 创建命令,使用参数将数据多次插入表中。
参数可以更高效地查询数据库,因为可以使用一组包含参数的 SQL 语句插入多个值。有关更多信息,请参见《SQL Server CE 联机手册》的在查询中使用参数。
cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (?, ?, ?)";
cmd.Parameters.Add(new SqlCeParameter("p1", SqlDbType.Int));
cmd.Parameters.Add(new SqlCeParameter("p2", SqlDbType.NText));
cmd.Parameters.Add(new SqlCeParameter("p3", SqlDbType.Money));
cmd.Parameters["p2"].Size = 50;
cmd.Prepare();
- 执行参数化命令,将数据插入表中。
cmd.Parameters["p1"].Value = 1;
cmd.Parameters["p2"].Value = "abc";
cmd.Parameters["p3"].Value = 15.66;
cmd.ExecuteNonQuery();
- 清除参数,并检查已插入表中的数据。
若要使用 SQL Server CE 的 SQL 编程语言读取现有数据,请使用 SELECT 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
cmd.Parameters.Clear();
//Set the command text to a SELECT query.
//
cmd.CommandText = "SELECT * FROM TestTbl";
读取 SQL Server CE 数据库数据
读取数据库数据是一种常见的任务,通常涉及对表行信息的访问。为使用 System.Data.SqlServerCe 执行此任务,您需要 SqlCeDataReader 和 SqlCeCommand 对象。
注意 有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
- 调用 SqlCeCommand 对象的 ExecuteReader 方法以创建 SqlCeDataReader 的实例。
SqlCeDataReader rdr = cmd.ExecuteReader();
- 指示数据读取器 rdr 在行存在时在每行的列中显示数据。
while (rdr.Read())
{MessageBox.Show("col1 = " + rdr.GetInt32(0) +
"col2 = " + rdr.GetString(1) +
"col3 = " + rdr.GetSqlMoney(2));
}
更改 SQL Server CE 数据库中的数据
在创建表后,可以以多种方式修改表中的数据:更改特定数据的属性,添加和删除数据行,甚至还可以通过修改表中的列来更改存储数据的方式。
在本节中,您将更改表项的值,查找更改的表的数据并处理所有错误。为执行这些步骤,您将使用在前面的任务中使用的类:SqlCeCommand 和 SqlCeDataReader。另外,您将使用 SqlCeException 进行错误处理。
注意 不能在此任务中运行仅用于特定步骤的代码。有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
更新 SQL Server CE 表中的数据
- 设置命令对象以使用 UPDATE 语句。
若要使用 SQL Server CE 的 SQL 编程语言更改行列的值,请使用 UPDATE 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
cmd.CommandText = "UPDATE TestTbl SET col2 = 'some new value' WHERE col1 = 0";
cmd.ExecuteNonQuery();
读取 SQL Server CE 表中的数据
- 设置命令对象以使用 SELECT 语句,然后通过执行 SqlCeCommand.ExecuteReader 创建数据读取器的实例。
cmd.CommandText = "SELECT * FROM TestTbl";
rdr = cmd.ExecuteReader();
while (rdr.Read())
{
MessageBox.Show(" col1 = " + rdr.GetInt32(0) +
" col2 = " + rdr.GetString(1) +
" col3 = " + rdr.GetSqlMoney(2));
}
}
- 使用 SqlCeException 捕获任何错误,然后关闭与数据库的连接。
catch (SqlCeException e)
{
ShowErrors(e);
}
finally
{
if(conn.State == ConnectionState.Open)
conn.Close();
}
}
public static void ShowErrors(SqlCeException e)
{
SqlCeErrorCollection errorCollection = e.Errors;
StringBuilder bld = new StringBuilder();
foreach (SqlCeError err in errorCollection)
{
bld.Append("\n Error Code: " + err.HResult.ToString("X"));
bld.Append("\n Message : " + err.Message);
bld.Append("\n Minor Err.: " + err.NativeError);
bld.Append("\n Source : " + err.Source);
foreach (int numPar in err.NumericErrorParameters)
{
if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);
}
foreach (string errPar in err.ErrorParameters)
{
if (String.Empty != errPar) bld.Append("\n Err. Par. : " + errPar);
}
MessageBox.Show(bld.ToString());
bld.Remove(0, bld.Length);
}
}
}
有关 SQL Server CE 中的错误处理的更多信息,请参见《SQL Server CE 联机手册》中的错误处理。
System.Data.SqlServerCe 命名空间
System.Data.SqlServerCe 命名空间是用于 SQL Server Compact 3.5 的托管数据提供程序。此命名空间是类的集合,这些类提供对 SQL Server Compact 3.5 数据库的访问。通过使用 System.Data.SqlServerCe,您可以从智能设备或计算机创建、管理和同步 SQL Server Compact 3.5 数据库。
以下功能可用于创建 SQL Server Compact 3.5 桌面应用程序。
- 对 System.Transaction.TransactionScope 类的支持。
- Entity Framework (System.Data.SqlServerCe.Entity.dll) 的 SQL Server Compact 3.5 提供程序。
- Visual Studio 2008 中的对 Visual C++ 速成版 和 Visual Basic 速成版 应用程序开发的支持。
- 通过使用 Sync Services for ADO.NET 对同步数据的支持。
|
类 |
说明 |
|
可用于循环访问 ResultSet 对象中的记录集合的枚举器。 ResultSetEnumerator 不应从代码直接使用。 直接使用SqlCeResultSet 对象可以获得更多功能。 |
|
|
实现数据绑定接口,并在用户界面控件与 SqlCeResultSet 之间起到桥梁作用。 |
|
|
基础结构。 |
|
|
提供可用于跟踪对 SQL Server Compact 数据库中的表所做更改的方法。 |
|
|
表示对数据源执行的 SQL 语句。 |
|
|
提供一种方法,以自动生成用于协调对 DataSet 所做的更改和关联数据库的单表命令。无法继承此类。 |
|
|
表示到 SQL Server Compact 3.5 数据源的连接是打开的。 |
|
|
表示一组数据命令和一个数据库连接,它们用于填充 DataSet 和更新数据源。 |
|
|
提供从数据源读取数据行的只进流的方法。无法继承此类。 |
|
|
表示 SQL Server Compact 3.5 引擎对象的属性、方法及其他对象。无法继承此类。 |
|
|
收集与数据源返回的警告或错误有关的信息。 无法继承此类。 |
|
|
收集 SQL Server Compact 3.5 的 .NET Compact Framework 数据访问接口产生的所有错误。 无法继承此类。 |
|
|
基础提供程序从 SQL Server Compact 3.5 数据源返回警告或错误时引发的异常。 无法继承此类。 |
|
|
封装 FlushFailure 事件的事件参数。 |
|
|
为 InfoMessage 事件提供数据。 无法继承此类。 |
|
|
尝试打开较旧或较新 SQL Server Compact 版本的数据库文件时,SQL Server Compact 数据源引发异常。 |
|
|
如果已经达到锁超时,则会引发此异常。 |
|
|
表示 SqlCeCommand 的参数,还可表示该参数到一个 DataSet 列的映射。 无法继承此类。 |
|
|
收集与 SqlCeCommand 有关的所有参数以及它们各自到 DataSet 列的映射。 |
|
|
表示一组方法,这些方法用于创建访问接口对数据源类的实现的实例。 |
|
|
初始化 SqlCeRemoteDataAccess 对象的新实例。有关远程数据访问的更多信息,请参见使用远程数据访问 (RDA)。 |
|
|
初始化 SqlCeReplication 对象的新实例。有关 SQL Server 复制的详细信息,请参阅 SQL Server 联机丛书。有关 SQL Server Compact 3.5 中合并复制的详细信息,请参阅 SQL Server Compact 3.5 联机丛书。 |
|
|
一个可更新、可滚动并且可绑定的游标。 |
|
|
为 RowUpdated 事件提供数据。 |
|
|
为 RowUpdating 事件提供数据。 |
|
|
表示要在数据源执行的 SQL 事务。无法继承此类。 |
|
|
在另一个事务进行期间尝试修改数据库时发生。 |
|
|
基础结构。 |
|
|
表示数据源中一行可更新的值。 SqlCeResultSet 对象包含一个或多个 UpdatableRecords。 |
|
|
基础结构。指定并检索从数据库中检索的参数和列中的元数据信息。 无法继承此类。 |
|
委托 |
说明 |
|
用户为开始从服务器下载表更改时激发的事件定义的委托。 |
|
|
用户为开始将表更改上载到服务器时激发的事件定义的委托。 |
|
|
一种用户定义的委托,使用调解程序工作期间报告的正在执行的同步事件。 |
|
|
必须实现侦听 FlushFailure 事件的委托。 |
|
|
表示将处理 SqlCeConnection 的 InfoMessage 事件的方法。 |
|
|
表示将要处理 SqlCeDataAdapter 的 RowUpdated 事件的方法。 |
|
|
表示处理 SqlCeDataAdapter 的 RowUpdating 事件的方法。 |
|
枚举 |
说明 |
|
确定在添加订阅时是将订阅添加到现有数据库还是创建新的数据库。 |
|
|
当传递给 Commit 函数时,CommitMode 指定发生提交的时间。 |
|
|
指定在使用 [System.Data.SqlServerCe.SqlCeResultSet.Insert] 方法时要使用的选项。 |
|
|
指定在指定要查找的索引范围时,SetRange 方法使用的选项。 |
|
|
指定 Seek 方法将如何对索引进行搜索的选项。 |
|
|
指定使用 DropSubscription 方法删除订阅时,是保留还是删除数据库。 |
|
|
指定仅将数据合并到发布服务器还是在发布服务器和订阅服务器之间进行双向合并。 |
|
|
指定在设置 SqlCeReplication 对象的 DistributorNetwork 或 PublisherNetwork 属性时使用的网络协议。 |
|
|
指定当使用 SqlCeChangeTracking 类的 PurgeTombstoneTableData 方法或 PurgeTransactionSequenceData 方法时用于清除元数据的条件。 |
|
|
指定是否将与 Push 相关联的行组成一批,归并到单个事务中。 |
|
|
指定是否跟踪正被提取到设备的表。 |
|
|
当传递给 Repair 方法时,RepairOption 指定要执行的数据库修复类型。 |
|
|
设置 ResultSetEnumerator 的选项。 |
|
|
设置 ResultSetEnumerator 的敏感度。 |
|
|
指定复制期间在连接到发布服务器或分发服务器时要使用的安全模式。 |
|
|
控制如何将快照文件从分发服务器传输到运行 IIS 的计算机。 |
|
|
指定用于标识跟踪数据的键的类型。 |
|
|
指定要跟踪的表操作。 |
|
|
指定要执行的数据验证的类型。 |
|
|
这些选项确定要使用的数据库验证的级别。 |
使用 System.Data.SqlServerCe
System.Data.SqlServerCe 提供了从运行在基于 Windows CE .NET 的平台上的 Microsoft Visual Studio .NET 应用程序对 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 数据库的编程访问。System.Data.SqlServerCe 提供了旨在公开 SQL Server CE 功能的类集。
有关如何使用 System.Data.SqlServerCe 类创建和访问 SQL Server CE 数据库的信息,请参见演练一节中的使用 SQL Server CE 数据库。
支持的功能
System.Data.SqlServerCe 提供了以下功能:
- 对 SQL Server CE 数据源的一致访问
共享数据的使用者应用程序可以使用 SQL Server CE 数据提供程序,连接到 SQL Server CE 数据源检索、操作和更新数据。
- 用于连接到数据库、运行命令和检索结果的组件
检索的结果可以直接处理,或放在 ADO.NET DataSet 对象中以便以一种特殊方式向用户公开,与来自多个数据源的数据合并或在各层之间远程传播。
- 对编写托管代码的开发人员的支持
该功能类似于 ADO 向本机 COM 开发人员提供的功能。
- 索引功能以实现最佳性能
SqlCeCommand.SetRange 限制通过 SqlCeDataReader.Read 和 SqlCeDataReader.Seek 调用可见的行项集。SqlCeDataReader.Seek 允许在当前范围内的关键值处直接定位。
- 通过 SqlCeReplication 和 SqlCeRemoteDataAccess 类与 SQL Server CE Replication 和远程数据访问 (RDA) 对象进行交互所需的接口
- 支持数据库创建和压缩的 SqlCeEngine 类方法。
- 参数化查询
在 SqlCeCommand.CommandText 属性中,所有参数占位符必须用问号 (?) 代替。不支持命名的参数。
- 数据库加密和密码保护
- SqlCeDataReader.GetValue 返回类型 SqlDecimal 的值。
System.Data.SqlServerCe 命名空间中的 SqlCeDataReader.GetValue 方法返回类型 System.Data.SqlTypes.SqlDecimal 的值,而 System.Data.SqlClient命名空间中的 SqlDataReader.GetValue 方法返回类型 System.Decimal 的值。
提供程序限制
System.Data.SqlServerCe 有以下限制:
- 仅支持与 SQL Server CE 数据源的一个并行连接。不过,与 System.Data.SqlClient 不同的是,System.Data.SqlServerCe 支持在同一连接上创建的多个数据读取器。
- 不支持批查询。查询必须是单个 SQL 语句。例如,下面的语句是有效的:
1. SELECT * FROM Customers
下面的语句是无效的:
2. SELECT * FROM Customers; SELECT * FROM Customers2
Datasets 必须从 SqlCeDataAdapter 中刷新。如果使用的是 Visual Studio .NET 项目中的代码,必须修改 SQL 语句以遵守此限制。
- 不支持嵌套或并行事务。
- 不支持命名的参数。
使用 System.Data.SqlClient
可以使用 System.Data.SqlClient 命名空间开发基于 Microsoft Windows CE .NET 的应用程序,这些应用程序将访问 Microsoft SQL Server 7.0 或更高版本中的数据库。System.Data.SqlClient 是 SQL Server .NET Framework 精简版数据提供程序。该数据提供程序与 .NET Framework 的 System.Data.SqlClient 命名空间相对应。
与它在 .NET Framework 中的副本一样,.NET Framework 精简版中的 System.Data.SqlClient 是特定类的集合,这些类可用于从基于 Windows CE .NET 的设备中访问包含托管代码的 SQL Server 数据库。
除非另外说明,否则 System.Data.SqlClient 命名空间中的所有对象与 .NET Framework 的 System.Data.SqlClient 命名空间中的相应对象相匹配。
提供程序限制
以下列表描述了适用于基于 Windows CE .NET 的设备和 .NET Framework 精简版的限制和例外情况:
- 不受支持的类
不支持 SqlClientPermission 和 SqlClientPermissionAttribute 类。
- ConnectionString 属性
在基于 Windows CE .NET 的设备上,使用 System.Data.SqlClient 的应用程序可能使用 Windows 身份验证协议,而不是使用 SQL Server 身份验证。为此,连接字符串必须包含以下属性。
属性 |
值 |
集成安全性 |
SSPI |
用户 ID |
Domain\username |
密码 |
<password> |
另外,不支持以下 ConnectionString 属性:AttachDBFilename、Max Pool Size、Min Pool Size、Connection Lifetime、Connection Reset、Enlist、Pooling、Network Library 和 Encrypt。
- ANSI 数据
仅在基于英语的设备上,才支持 SQL_Latin1_General_CP1_CI_AS 排序规则的 ANSI 数据。.NET Framework 中的所有字符串都是 Unicode。System.Data.SqlClient 使用 .NET Framework 编码类将 SQL Server 中的 ANSI 数据转换为 Unicode。尽管在 .NET Framework 精简版中支持编码类,但并非支持所有代码页。
此外,如果基于 Windows CE .NET 的设备未提供 ANSI 列的代码页,则 System.Data.SqlClient 不能读取或写入该列。如果不能使用 ANSI 到 Unicode 转换的代码页,System.Data.SqlClient 就会生成错误。
有关可用于基于 Windows CE .NET 的特定设备的代码页的信息,请与设备制造商联系。
- 连接池
不支持连接池。任何时候,设备与 SQL Server 实例都只能有少量的连接。
- 分布式事务
不支持分布式事务。事务不能跨数据库或服务器。System.Data.SqlClient 在分布式事务期间产生 InvalidOperationException 异常。
- 网络库选择
只支持与 SQL Server 实例的 TCP/IP 连接。System.Data.SqlClient 不能通过设备插座连接到 SQL Server。
- 网络库加密
不支持与 SQL Server 实例的加密连接。如果运行 SQL Server 的计算机上安装了安全套接层 (SSL) 证书,连接将失败。
- Windows 身份验证
支持 Windows 身份验证;不过,必须始终在连接字符串中指定用于域控制器中的身份验证的用户 ID 和密码。
有关更多信息,请参见 .NET Framework 精简版 SDK 中的 System.Data.SqlClient 命名空间参考。
使用 SQL Server CE 管理数据
可以使用 Microsoft ADO.NET 访问设备上的 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 数据库。SQL Server CE 提供了与基本关系数据库功能相似的 SQL Server 编程模型,即数据库存储区、查询处理器以及可靠且可伸缩的连接。
SQL Server CE 连接解决方案使用 Web 协议 HTTP 或 HTTPS 进行通信。在使用连接解决方案之前,必须在运行 IIS 的计算机上安装 SQL Server CE Server Tools。SQL Server CE 支持以下连接解决方案,这些连接解决方案用于管理设备上的 SQL Server CE 数据库和服务器上的 SQL Server 数据库之间的数据:
- 合并复制
- 远程数据访问 (RDA)
在通过 HTTP 使用复制或 RDA 访问 SQL Server 的数据库之前,必须设置一个虚拟目录并配置相应的 NTFS 权限。有关更多信息,请参见《SQL Server CE 联机手册》的配置连接安全性。
合并复制
SQL Server CE 中的合并复制基于 Microsoft SQL Server 2000 中实现的合并复制。合并复制非常适合移动设备,因为它使移动设备和服务器上的数据可以分别更新。以后当设备连接到服务器时,设备和服务器上的数据可以同步。
合并复制的常见方案包括:只读复制,数据捕获和上载,以及复制、更新和同步。大多数应用程序将这些方案组合起来使用。例如,销售支持应用程序可能使用只读复制将价格表下载到设备中,同时依靠数据捕获和上载捕获设备上的新订单,然后将它们上载到服务器中。
可以使用水平和垂直筛选器定义和维护不同客户端或客户端组的唯一数据子集。水平筛选器可用于复制已发布的表行的子集。垂直筛选器可用于复制已发布的表列的子集。
有关更多信息,请参见《SQL Server CE 联机手册》的使用复制。
若要实现复制,请使用 System.Data.SqlServerCe 命名空间的 SqlCeReplication 类。
远程数据访问
RDA 为基于 Windows CE .NET 的应用程序提供了访问位于 Microsoft SQL Server 7.0 版或 SQL Server 2000 远程实例上的数据库的简单方法。当不需要使用合并复制的完整功能时可以使用 RDA。使用 RDA 时不需要配置 SQL Server 复制或创建发布。
应用程序可以用两种方式使用 RDA:一种是应用程序提交数据操作语言 (DML) 语句,该语句被转交到 SQL Server 系统以执行,另一种是应用程序提供返回行集合的 SQL 查询。结果行集合被传送到基于 Windows CE 的设备,并以表的形式存储在那里。还选择跟踪应用程序所做的所有更改。当应用程序发出请求时,更新的行被发送回服务器,并在那里应用于 SQL Server 数据库。
有关更多信息,请参见《SQL Server CE 联机手册》的使用远程数据访问。
若要实现 RDA,请使用 System.Data.SqlServerCe 命名空间的 SqlCeRemoteDataAccess 类。
有关 SQL Server CE 的更多信息,请参见 SQL Server CE 联机手册
配置 SQL Server CE 开发环境
Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 的开发环境可配置为单服务器环境或多服务器环境。基于 Windows CE .NET 的设备可直接连接到单服务器或多服务器开发环境。根据服务器配置的不同,可能需要在多台计算机上安装 SQL Server CE Server Tools。布署和调试应用程序必须使用 Microsoft ActiveSync。
多台服务器通常用在生产环境中(特别是在公司中),因为它们提供了更大的灵活性,并且能够更好地满足复杂的安全需要。但是,如果您是首次设置 SQL Server CE,可以考虑设置单服务器环境。这样可以将所有必要的服务器软件安装在一台计算机上。若要进一步简化设置,可以将单服务器和开发环境组合在一台计算机上,创建一个完整的开发和测试环境。成功设置了单服务器环境后,可以很容易地迁移到多服务器环境。
注意 可以使用模拟器测试应用程序;不过,在通过模拟器运行应用程序时不能使用安全套接层 (SSL) 加密。
安装 Visual Studio .NET 时会自动配置 SQL Server CE 的开发环境。在安装 Visual Studio 后,还必须配置 Microsoft Internet 信息服务 (IIS) 系统和基于 Windows CE .NET 的设备。运行 IIS 的计算机上还必须安装 SQL Server CE Server Tools。SQL Server CE Server Tools 只与 SQL Server 2000 Service Pack 1 和更高版本兼容。在同时运行 IIS 和 SQL Server 2000 的计算机上安装 SQL Server CE Server Tools 时,要确保 SQL Server CE Server Tools 的安装程序与 SQL Server 2000 版本相对应。
文件名 |
兼容版本 |
Sqlcesql2ksp1.exe |
SQL Server 2000 Service Pack 1 |
Sqlcesql2ksp2.exe |
SQL Server 2000 Service Pack 2 |
SQL Server CE 组件位置
SQL Server CE 组件包含在 Microsoft Visual Studio .NET 中。下表按文件位置列出了安装在开发计算机上的文件。默认情况下,这些文件和位置在 \Program Files\Microsoft Visual Studio .NET 2003\CompactFrameworkSDK\v1.0.5000 中创建。
位置 |
内容 |
\Windows CE |
包含 SQL Server CE Assemblies、System.Data.SqlServerCe.dll 和System.Data.Common 的文件夹。 |
\Windows CE\wce300 |
一系列子文件夹,包含 CAB 文件 Sqlce.platform.processor.cab、Sqlce.dev.platform.processor.cab 和 Sql.platform.processor.cab。每个文件夹与 Windows CE 操作系统的一个版本和一个处理器类型相对应。 |
\ |
包含 SQL Server CE 联机手册 (Sqlce.chm)、SQL Server CE Server Tools 自解压缩可执行文件(Sqlcesql2ksp1.exe 或 Sqlcesql2ksp2.exe)和 ActiveSync 的 SQL Server CE Relay 扩展 (SSCERelay.exe)。 |
\Samples |
一系列包含示例应用程序的文件夹。 |
有关安装问题的更多信息,请参见《SQL Server CE 联机手册》中的以下主题:
请参见
在Wince和Windows Mobile下最常用的数据库为SQL CE,SQL CE也曾经叫做SQL Server for Windows CE和SQL Server
Mobile Edition,最新版本命名为SQL Server Compact 3.5 SP1。 SQL Server Compact不仅仅能运行于Wince和Windows Mobile,而且能运行于Windows的PC上,是Access的有效替代品,如果不使用存储过程,在SQL Server Compact下开发的程序几乎可以无修改移植到SQL Server的其他服务器版本上。可以参见这篇文章 SQL Server Express和SQL Server Compact的应用 。在这篇文章中我会使用SQL CE这一命名。
在.NET Compact Framework下进行SQL CE使用和开发,需要应用库System.Data.SqlServerCe.dll,需要注意的是不同的SQL CE版本使用不用的DLL版本. SQL CE 3.5的库一般对应以下的目录 C:Program FilesMicrosoft SQL Server Compact Editionv3.5 ADO.net DLL,而SQL CE 3.0的库一般对应以下的目录 C:Program FilesMicrosoft Visual Studio 8SmartDevicesSDKSQL ServerMobile,彼此不相兼容。由于开发的命名空间(namespace)是一致的,所以开发的程序可以用在不用的SQL CE版本。
helper类
下面演示的是一个SQL CE的helper类,这个类只是针对SQL CE数据库,没有考虑移植到其他数据库,所以所有的类都使用SQL CE相关的类。
class SqlCeHelper : IDisposable
{
private SqlCeConnection connection;
private SqlCeCommand command;
private const string connectionString = "Data Source=/DB/db.sdf";
#region Open/Close
public void Open()
{
try
{
connection = new SqlCeConnection(connectionString);
command = connection.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
connection.Open();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
}
public void Close()
{
connection.Close();
connection.Dispose();
}
public void Dispose()
{
connection.Close();
connection.Dispose();
command.Dispose();
}
#endregion
#region Operatons
public SqlCeDataReader ExecuteReader(string sql)
{
command.CommandText = sql;
SqlCeDataReader reader = null;
try
{
reader = command.ExecuteReader();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return reader;
}
public DataSet ExecuteDataSet(string sql)
{
command.CommandText = sql;
SqlCeDataAdapter adapter = new SqlCeDataAdapter(command);
DataSet ds = new DataSet(); ;
try
{
adapter.Fill(ds);
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return ds;
}
public int ExecuteNonQuery(string sql)
{
command.CommandText = sql;
int result = -1;
try
{
result = command.ExecuteNonQuery();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return result;
}
public object ExecuteScalar(string sql)
{
command.CommandText = sql;
object o = null;
try
{
o = command.ExecuteScalar();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return o;
}
#endregion
#region Transaction
public void BeginTransaction()
{
command.Transaction = connection.BeginTransaction();
}
public void CommitTransaction()
{
command.Transaction.Commit();
}
public void RollbackTransaction()
{
command.Transaction.Rollback();
}
#endregion
}
1.建立SQL CE的连接(SqlCeConnection)只需要指定数据库文件路径,在这个类,我hardcode了文件路径,在实际应用中,可以在构
造函数进行初始化,或者在Open函数中传递路径参数。
2.由于SQL CE当前版本不支持存储过程,所以SqlCeCommand的CommandType指定为CommandType.Text,只支持执行SQL语句。
3.实现了通用操作方法ExecuteReader,ExecuteDataSet,ExecuteNonQuery和ExecuteScalar。
4.SQL CE支持事务(Transaction)。
使用
上图为使用例子的表结构。
SqlCeHelper sqlCe = new SqlCeHelper();
sqlCe.Open();
sqlCe.BeginTransaction();
if (sqlCe.ExecuteNonQuery("delete from t") < 0)
{
sqlCe.RollbackTransaction();
return;
}
if (sqlCe.ExecuteNonQuery("insert into t (f1, f2) values (1, 'abc')") < 0)
{
sqlCe.RollbackTransaction();
return;
}
SqlCeDataReader reader = sqlCe.ExecuteReader("select * from t where f1 = 1");
while (reader.Read())
{
Console.WriteLine("reader: f2:{0}n", reader["f2"]);
}
if (!reader.IsClosed)
{
reader.Close();
}
if (sqlCe.ExecuteNonQuery("update t set f2 = 'xyz'") < 0)
{
sqlCe.RollbackTransaction();
return;
}
DataSet ds = sqlCe.ExecuteDataSet("select * from t");
foreach (DataRow dr in ds.Tables[0].Rows)
{
Console.WriteLine("dataset: f2:{0}n", dr["f2"]);
}
sqlCe.CommitTransaction();
sqlCe.Close();
使用这个Helper类很简单,先生成这个类的实例,打开数据库连接,使用ExecuteReader和ExecuteDataSet进行查询操作,使用ExecuteNonQuery进行增删改的操作。在操作过程中,同时可以加入事务处理操作,使用完毕关闭数据库连接。
在Wince和Windows Mobile下最常用的数据库为SQL CE,SQL CE也曾经叫做SQL Server for Windows CE和SQL Server Mobile Edition,最新版本命名为SQL Server Compact 3.5 SP1。 SQL Server Compact不仅仅能运行于Wince和Windows Mobile,而且能运行于Windows的PC上,是Access的有效替代品,如果不使用存储过程,在SQL Server Compact下开发的程序几乎可以无修改移植到SQL Server的其他服务器版本上。可以参见这篇文章 SQL Server Express和SQL Server Compact的应用 。在这篇文章中我会使用SQL CE这一命名。
在.NET Compact Framework下进行SQL CE使用和开发,需要应用库System.Data.SqlServerCe.dll,需要注意的是不同的SQL CE版本使用不用的DLL版本. SQL CE 3.5的库一般对应以下的目录 C:\Program Files\Microsoft SQL Server Compact Edition\v3.5 ADO.net DLL,而SQL CE 3.0的库一般对应以下的目录 C:\Program Files\Microsoft Visual Studio 8\SmartDevices\SDK\SQL Server\Mobile,彼此不相兼容。由于开发的命名空间(namespace)是一致的,所以开发的程序可以用在不用的SQL CE版本。
helper类
下面演示的是一个SQL CE的helper类,这个类只是针对SQL CE数据库,没有考虑移植到其他数据库,所以所有的类都使用SQL CE相关的类。
class SqlCeHelper : IDisposable
{
private SqlCeConnection connection;
private SqlCeCommand command;
private const string connectionString = "Data Source=/DB/db.sdf";
#region Open/Close
public void Open()
{
try
{
connection = new SqlCeConnection(connectionString);
command = connection.CreateCommand();
command.Connection = connection;
command.CommandType = CommandType.Text;
connection.Open();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
}
public void Close()
{
connection.Close();
connection.Dispose();
}
public void Dispose()
{
connection.Close();
connection.Dispose();
command.Dispose();
}
#endregion
#region Operatons
public SqlCeDataReader ExecuteReader(string sql)
{
command.CommandText = sql;
SqlCeDataReader reader = null;
try
{
reader = command.ExecuteReader();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return reader;
}
public DataSet ExecuteDataSet(string sql)
{
command.CommandText = sql;
SqlCeDataAdapter adapter = new SqlCeDataAdapter(command);
DataSet ds = new DataSet(); ;
try
{
adapter.Fill(ds);
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return ds;
}
public int ExecuteNonQuery(string sql)
{
command.CommandText = sql;
int result = -1;
try
{
result = command.ExecuteNonQuery();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return result;
}
public object ExecuteScalar(string sql)
{
command.CommandText = sql;
object o = null;
try
{
o = command.ExecuteScalar();
}
catch (DataException e)
{
Console.WriteLine(e.Message);
}
return o;
}
#endregion
#region Transaction
public void BeginTransaction()
{
command.Transaction = connection.BeginTransaction();
}
public void CommitTransaction()
{
command.Transaction.Commit();
}
public void RollbackTransaction()
{
command.Transaction.Rollback();
}
#endregion
}
1.建立SQL CE的连接(SqlCeConnection)只需要指定数据库文件路径,在这个类,我hardcode了文件路径,在实际应用中,可以在构造函数进行初始化,或者在Open函数中传递连接串参数。
2.由于SQL CE当前版本不支持存储过程,所以SqlCeCommand的CommandType指定为CommandType.Text,只支持执行SQL语句。
3.实现了通用操作方法ExecuteReader,ExecuteDataSet,ExecuteNonQuery和ExecuteScalar。
4.SQL CE支持事务(Transaction)。
使用
上图为使用例子的表结构。
SqlCeHelper sqlCe = new SqlCeHelper();
sqlCe.Open();
sqlCe.BeginTransaction();
if (sqlCe.ExecuteNonQuery("delete from t") < 0)
{
sqlCe.RollbackTransaction();
return;
}
if (sqlCe.ExecuteNonQuery("insert into t (f1, f2) values (1, 'abc')") < 0)
{
sqlCe.RollbackTransaction();
return;
}
SqlCeDataReader reader = sqlCe.ExecuteReader("select * from t where f1 = 1");
while (reader.Read())
{
Console.WriteLine("reader: f2:{0}\n", reader["f2"]);
}
if (!reader.IsClosed)
{
reader.Close();
}
if (sqlCe.ExecuteNonQuery("update t set f2 = 'xyz'") < 0)
{
sqlCe.RollbackTransaction();
return;
}
DataSet ds = sqlCe.ExecuteDataSet("select * from t");
foreach (DataRow dr in ds.Tables[0].Rows)
{
Console.WriteLine("dataset: f2:{0}\n", dr["f2"]);
}
sqlCe.CommitTransaction();
sqlCe.Close();
使用这个Helper类很简单,先生成这个类的实例,打开数据库连接,使用ExecuteReader和ExecuteDataSet进行查询操作,使用ExecuteNonQuery进行增删改的操作。在操作过程中,同时可以加入事务处理操作,使用完毕关闭数据库连接。
参考文献
System.Data.SqlServerCe Namespace
作者:Jake Lin(Jake's Blog on 博客园)
出处:http://procoder.cnblogs.com
本作品由Jake Lin创作,采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。 任何转载必须保留完整文章,在显要地方显示署名以及原文链接。如您有任何疑问或者授权方面的协商,请给我留言。
演练:使用 SQL Server CE 数据库
本节将指导您完成使用 Microsoft SQL Server 2000 Windows CE Edition (SQL Server CE) 数据库时需要执行的主要任务。假定您没有任何 SQL Server CE 数据库,需要在新的 Microsoft Visual Studio .NET 项目中创建新的数据库。
该演练包括以下任务:
- 创建新的 SQL Server CE 数据库
- 读取 SQL Server CE 数据库数据
- 更改 SQL Server CE 数据库中的数据
阐释以上每个任务步骤的代码旨在一起运行。不能在任务中运行仅用于特定步骤的代码。有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
创建新的数据库
SQL Server CE 中的数据库是存储结构化数据的表集合。在可以存储数据库之前,必须创建数据库。在创建数据库之后,可以创建保存数据的表。
在本节中,您将创建一个新的数据库,然后创建一个表,最后将数据添加到该表中。若要执行这些步骤,请使用 SQL Server CE (System.Data.SqlServerCe) .NET Framework 精简版数据提供程序的 SqlCeConnection、SqlCeEngine 和 SqlCeCommand 类。
注意 不能在此任务中运行仅用于特定步骤的代码。有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
创建新的 SQL Server CE 数据库
- 启动 Visual Studio .NET,然后打开一个新项目。
- 创建对使用的命名空间的引用。
- 创建 WalkThrough 类。
- 验证具有您打算使用的名称的数据库是否已存在。
- 使用 System.Data.SqlCeEngine 对象创建名为 Test.sdf 的空数据库。
1. using System;
2. using System.IO;
3. using System.Text;
4. using System.Data;
5. using System.Data.SqlServerCe;
6. using System.Collections;
7. using System.Windows.Forms;
8. using System.Data.Common;
1. public class WalkThrough
2. {
3. static void Main()
4. {
5. SqlCeConnection conn = null;
6.
7. try
8. {
1. if (File.Exists ("Test.sdf") )
2. File.Delete ("Test.sdf");
注意 SQL Server CE 中,数据库名称的文件扩展名为 .sdf。
1. SqlCeEngine engine = new SqlCeEngine ("Data Source = Test.sdf");
2. engine.CreateDatabase ();
- 连接到这个新数据库。
1. conn = new SqlCeConnection ("Data Source = Test.sdf");
2. conn.Open();
创建新表
- 使用 System.Data.SqlCeCommand 创建命令类的实例。
- 运行命令 cmd 创建表。用于创建表的指令必须在 cmd.CommandText 所包含的 SQL 代码中。
1. SqlCeCommand cmd = conn.CreateCommand();
若要使用 SQL Server CE 的 SQL 编程语言创建表,请使用 CREATE TABLE 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
1. cmd.CommandText = "CREATE TABLE TestTbl(col1 int PRIMARY KEY, col2 ntext, col3 money)";
2. cmd.ExecuteNonQuery();
将数据添加到新表中
- 运行命令以添加数据行。与创建表相同,用于添加行的指令也必须在 cmd.CommandText 所包含的 SQL 代码中。
若要使用 SQL Server CE 的 SQL 编程语言将行添加到表中,请使用 INSERT 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
1. cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (0, 'abc', 15.66)";
2. cmd.ExecuteNonQuery();
- 创建命令,使用参数将数据多次插入表中。
参数可以更高效地查询数据库,因为可以使用一组包含参数的 SQL 语句插入多个值。有关更多信息,请参见《SQL Server CE 联机手册》的在查询中使用参数。
1. cmd.CommandText = "INSERT INTO TestTbl(col1, col2, col3) VALUES (?, ?, ?)";
2.
3. cmd.Parameters.Add(new SqlCeParameter("p1", SqlDbType.Int));
4. cmd.Parameters.Add(new SqlCeParameter("p2", SqlDbType.NText));
5. cmd.Parameters.Add(new SqlCeParameter("p3", SqlDbType.Money));
6.
7. cmd.Parameters["p2"].Size = 50;
8.
9. cmd.Prepare();
- 执行参数化命令,将数据插入表中。
- 清除参数,并检查已插入表中的数据。
1. cmd.Parameters["p1"].Value = 1;
2. cmd.Parameters["p2"].Value = "abc";
3. cmd.Parameters["p3"].Value = 15.66;
4. cmd.ExecuteNonQuery();
若要使用 SQL Server CE 的 SQL 编程语言读取现有数据,请使用 SELECT 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
1. cmd.Parameters.Clear();
2. //Set the command text to a SELECT query.
3. //
4. cmd.CommandText = "SELECT * FROM TestTbl";
读取 SQL Server CE 数据库数据
读取数据库数据是一种常见的任务,通常涉及对表行信息的访问。为使用 System.Data.SqlServerCe 执行此任务,您需要 SqlCeDataReader 和 SqlCeCommand对象。
注意 有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
- 调用 SqlCeCommand 对象的 ExecuteReader 方法以创建 SqlCeDataReader 的实例。
- 指示数据读取器 rdr 在行存在时在每行的列中显示数据。
1. SqlCeDataReader rdr = cmd.ExecuteReader();
1. while (rdr.Read())
2. {MessageBox.Show("col1 = " + rdr.GetInt32(0) +
3. "col2 = " + rdr.GetString(1) +
4. "col3 = " + rdr.GetSqlMoney(2));
5. }
更改 SQL Server CE 数据库中的数据
在创建表后,可以以多种方式修改表中的数据:更改特定数据的属性,添加和删除数据行,甚至还可以通过修改表中的列来更改存储数据的方式。
在本节中,您将更改表项的值,查找更改的表的数据并处理所有错误。为执行这些步骤,您将使用在前面的任务中使用的类:SqlCeCommand 和SqlCeDataReader。另外,您将使用 SqlCeException 进行错误处理。
注意 不能在此任务中运行仅用于特定步骤的代码。有关完整代码列表,请参见代码列表:使用 SQL Server CE 数据库。
更新 SQL Server CE 表中的数据
- 设置命令对象以使用 UPDATE 语句。
若要使用 SQL Server CE 的 SQL 编程语言更改行列的值,请使用 UPDATE 语法。有关更多信息,请参见《SQL Server CE 联机手册》中的用于 SQL Server CE 的 SQL 参考。
1. cmd.CommandText = "UPDATE TestTbl SET col2 = 'some new value' WHERE col1 = 0";
2. cmd.ExecuteNonQuery();
读取 SQL Server CE 表中的数据
- 设置命令对象以使用 SELECT 语句,然后通过执行 SqlCeCommand.ExecuteReader 创建数据读取器的实例。
- 使用 SqlCeException 捕获任何错误,然后关闭与数据库的连接。
1. cmd.CommandText = "SELECT * FROM TestTbl";
2.
3. rdr = cmd.ExecuteReader();
4.
5. while (rdr.Read())
6. {
7. MessageBox.Show(" col1 = " + rdr.GetInt32(0) +
8. " col2 = " + rdr.GetString(1) +
9. " col3 = " + rdr.GetSqlMoney(2));
10. }
11.
12. }
1. catch (SqlCeException e)
2. {
3. ShowErrors(e);
4. }
5. finally
6. {
7. if(conn.State == ConnectionState.Open)
8. conn.Close();
9. }
10. }
11.
12. public static void ShowErrors(SqlCeException e)
13. {
14. SqlCeErrorCollection errorCollection = e.Errors;
15.
16. StringBuilder bld = new StringBuilder();
17.
18. foreach (SqlCeError err in errorCollection)
19. {
20. bld.Append("\n Error Code: " + err.HResult.ToString("X"));
21. bld.Append("\n Message : " + err.Message);
22. bld.Append("\n Minor Err.: " + err.NativeError);
23. bld.Append("\n Source : " + err.Source);
24.
25. foreach (int numPar in err.NumericErrorParameters)
26. {
27. if (0 != numPar) bld.Append("\n Num. Par. : " + numPar);
28. }
29.
30. foreach (string errPar in err.ErrorParameters)
31. {
32. if (String.Empty != errPar) bld.Append("\n Err. Par. : " + errPar);
33. }
34.
35. MessageBox.Show(bld.ToString());
36. bld.Remove(0, bld.Length);
37. }
38. }
39. }
有关 SQL Server CE 中的错误处理的更多信息,请参见《SQL Server CE 联机手册》中的错误处理。