本文介绍了客户端应用程序和小规模服务器应用程序的数据存储问题,讨论了 SSCE 的功能集以及该功能集如何解决数据存储问题,对各种与 SSCE 相适用的应用程序体系结构进行了介绍。
出于数据同步的目的,通常要采用一种更直接的途径来限制应用程序的复杂性。使用 RDA 或合并复制时,同步体系结构更像图 3 所示。在这种情况下,客户端应用程序通过 HTTP 连接到后端数据库,Internet 信息服务 (IIS) 会公开 HTTP 端点(通过该端点执行同步通信)。
图 3. 现场团队同步体系结构
若要在客户端执行数据访问,可以使用一般的断开 ADO.NET 数据访问的方法,例如,使用类型化数据集及其关联的表适配器从本地 SSCE Northwind 数据存储中读取和写入数据,如以下代码示例所示。可以看到,类型化数据集将对基本存储的所有详细信息进行抽象化,并且,如果数据位于可通过受支持的托管 ADO.NET 提供程序来访问的 SQL Server、SSE 或另一个数据存储中,则此数据使用者代码将不会发生变化。在 CustomersTableAdapter 内,SqlCeConnection 和 SqlCeCommand 对象由 Visual Studio 设计者定义,并使用标准 ADO.NET 数据访问模式对 SSCE 数据库中的数据执行所有检索和更新工作。
代码示例:使用类型化数据集执行读/写数据访问
private NorthwindDataSet LoadDataSet()
{
NorthwindDataSet nwData = new NorthwindDataSet();
CustomersTableAdapter adapter = new CustomersTableAdapter();
adapter.Fill(nwData.Customers);
return nwData;
}
private void SaveChanges(NorthwindDataSet nwData)
{
CustomersTableAdapter adapter = new CustomersTableAdapter();
adapter.Update(nwData);
} |
SqlCeResultSet 还支持连接的数据访问模型,如下一个代码示例所示。在此方法中,将创建 SqlCeConnection 和 SqlCeCommand 以便检索数据行(尽管它同样适用于多行结果集)。然后,我们打开连接,并执行命令来检索 SqlCeResultSet,然后通过它执行数据记录更新。在此简单示例中,通过使用阻止来关闭了连接。但在正常情况下,如果要跨越较大代码作用范围保持连接,并且可以在不必打开和关闭连接的情况下读写数据库,则应使用 SqlCeResultSet。在该情况下,在使用结果集之后不会立即关闭连接;而会使它保持打开状态,在用它完成操作后再关闭 SqlCeResultSet。
代码示例:使用 SqlCeResultSet 执行读/写数据访问
private void UpdateCompanyName(string custId, string companyName)
{
// 建立连接,只需要 sdf 文件的路径
SqlCeConnection conn =
new SqlCeConnection(
@"Data Source ='.\Northwind.sdf'");
// 建立选择查询,在结果集里列出行的内容
string selQuery =
"SELECT * FROM Customers WHERE [Customer ID] = @CustID";
SqlCeCommand getCustCmd = new SqlCeCommand(selQuery, conn);
getCustCmd.Parameters.Add("@CustID", custId);
using (conn)
{
conn.Open();
// 把行拉进结果集,
// 使用选项来允许已连接的、随机的和可读写的访问
SqlCeResultSet resultSet =
getCustCmd.ExecuteResultSet(
ResultSetOptions.Scrollable |
ResultSetOptions.Updatable);
// 移到第一个记录
if (resultSet.ReadFirst())
{
// 得到列的位置
int ordinal = resultSet.GetOrdinal("Company Name");
// 设置值
resultSet.SetString(ordinal, companyName);
// 永久保存
resultSet.Update();
}
else // 没有匹配的
{
throw new ArgumentException("Customer not found");
}
}
} |