WebService架构提交数据-生成仅包含修改了字段的数据表
WebService架构提交数据-生成仅包含修改了字段的数据表
WebService架构提交数据
使用WebService架构开发的数据库应用软件不适合大批量上传和下载数据,不是技术不能实现,而是广域网络太娇情!因网速限制只能从技术上突破,优化上传和下载的数据是非常重要的工作,本文介绍如何优化上传的数据。
我们可以通过下面两点优化数据:
1. 压缩数据包
2. 上传仅包含修改了字段的数据表
下图展示生成仅包含修改了字段的数据表:

通过FieldChangedsObserver对象管理一个DataTable,自动生成仅包含修改了数据的字段列表,这种机制有效避免了上传到未修改的数据到WebServer,节省带宽,提高效能。
示范程序截图:


FieldChangedObserver示范程序截图

C# Code:
private void btnSubmit_Click(object sender, EventArgs e)
{
//生成仅包含修改了字段的数据
DataSet ds = new DataSet();
ds.Tables.Add(_master.ChangedFieldTable);
ds.Tables.Add(_detail.ChangedFieldTable);
//调用WebService层提交数据
bool success = MyWebService.Submit(ds);
if (success)
MessageBox.Show("Submit data successfully!");
else
MessageBox.Show("An error occurred while submit data via webservice!");
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
private void btnSubmit_Click(object sender, EventArgs e)
{
//生成仅包含修改了字段的数据
DataSet ds = new DataSet();
ds.Tables.Add(_master.ChangedFieldTable);
ds.Tables.Add(_detail.ChangedFieldTable);
//调用WebService层提交数据
bool success = MyWebService.Submit(ds);
if (success)
MessageBox.Show("Submit data successfully!");
else
MessageBox.Show("An error occurred while submit data via webservice!");
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
观察两个数据表:
C# Code:
//观察字段
_master = new FieldChangedObserver(ds.Tables[0], "SONO");
_detail = new FieldChangedObserver(ds.Tables[1], "ISID");
//观察字段
_master = new FieldChangedObserver(ds.Tables[0], "SONO");
_detail = new FieldChangedObserver(ds.Tables[1], "ISID");
C# Code:
/// <summary>
/// 观察的数据表是否被用户修改数据
/// </summary>
public class FieldChangedObserver
{
private DataTable _observedTable;//被观察的数据表
private List<DataColumn> _changedColumns;//观察到已修改的栏位
private string _primaryKeyFieldName;//主键
/// <summary>
/// 构造器
/// </summary>
/// <param name="observedTable">被观察的数据表</param>
/// <param name="primaryKeyFieldName">主键</param>
public FieldChangedObserver(DataTable observedTable, string primaryKeyFieldName)
{
_observedTable = observedTable;
_changedColumns = new List<DataColumn>();
_primaryKeyFieldName = primaryKeyFieldName;
_observedTable.ColumnChanged = new DataColumnChangeEventHandler(_observedTable_ColumnChanged);
}
//当用户修改数据时触发的事件
private void _observedTable_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
if (_changedColumns.IndexOf(e.Column) >= 0) return;
_changedColumns.Add(e.Column);
}
/// <summary>
/// 返回仅包含已修改栏位的数据表。
/// </summary>
public DataTable ChangedFieldTable
{
get
{
//获取用户已修改的数据
DataTable changes = _observedTable.GetChanges();
if (changes == null) return _observedTable.Clone();
//删除未修改的栏位
foreach (DataColumn column in _observedTable.Columns)
{
//不处理主键
if (column.ColumnName.ToUpper() == _primaryKeyFieldName.ToUpper()) continue;
//找到未修改的栏位则删除。
if (_changedColumns.IndexOf(column) < 0)
changes.Columns.Remove(column.ColumnName);
}
return changes;
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898
/// <summary>
/// 观察的数据表是否被用户修改数据
/// </summary>
public class FieldChangedObserver
{
private DataTable _observedTable;//被观察的数据表
private List<DataColumn> _changedColumns;//观察到已修改的栏位
private string _primaryKeyFieldName;//主键
/// <summary>
/// 构造器
/// </summary>
/// <param name="observedTable">被观察的数据表</param>
/// <param name="primaryKeyFieldName">主键</param>
public FieldChangedObserver(DataTable observedTable, string primaryKeyFieldName)
{
_observedTable = observedTable;
_changedColumns = new List<DataColumn>();
_primaryKeyFieldName = primaryKeyFieldName;
_observedTable.ColumnChanged = new DataColumnChangeEventHandler(_observedTable_ColumnChanged);
}
//当用户修改数据时触发的事件
private void _observedTable_ColumnChanged(object sender, DataColumnChangeEventArgs e)
{
if (_changedColumns.IndexOf(e.Column) >= 0) return;
_changedColumns.Add(e.Column);
}
/// <summary>
/// 返回仅包含已修改栏位的数据表。
/// </summary>
public DataTable ChangedFieldTable
{
get
{
//获取用户已修改的数据
DataTable changes = _observedTable.GetChanges();
if (changes == null) return _observedTable.Clone();
//删除未修改的栏位
foreach (DataColumn column in _observedTable.Columns)
{
//不处理主键
if (column.ColumnName.ToUpper() == _primaryKeyFieldName.ToUpper()) continue;
//找到未修改的栏位则删除。
if (_changedColumns.IndexOf(column) < 0)
changes.Columns.Remove(column.ColumnName);
}
return changes;
}
}
}
//来源:C/S框架网(www.csframework.com) QQ:1980854898

Source code free download!
参考文档:
Winform三层架构+WebService+权限管理系统软件开发平台(C#.NET开发)
WebService, WCF, WebApi 的区别与应用|C/S框架网推荐文档
WebServiceSecurity.ValidateLoginer方法要抛出异常
开发框架3.0:WebService升级WCF操作指引(1)
未能找到文件"C:\Program Files\....\IDE\WebServiceReference.dll.config"
你的开发框架能自动生成WebService层的接口吗?
架构C#WebService程序
什么是WebService?
C#转换IList对象数组为byte数组.然后通过WebService传递
ASP.NET修改WebService开发环境的端口
什么是VWDPort? (Virtual WebService Dynamic Port)
修改ASP.Net开发环境下的服务器端口(WebService Server Port)
标签:C# Winform+WebService+三层C/S结构快速开发平台
C# WebService代理类详解
愚公移山 - 已完成高级版纯WebService版
C# WebService异步处理/异步调用详解
Winform三层架构+WebService+权限管理系统软件开发平台(C#.NET开发)
WebService, WCF, WebApi 的区别与应用|C/S框架网推荐文档
WebServiceSecurity.ValidateLoginer方法要抛出异常
开发框架3.0:WebService升级WCF操作指引(1)
未能找到文件"C:\Program Files\....\IDE\WebServiceReference.dll.config"
你的开发框架能自动生成WebService层的接口吗?
架构C#WebService程序
什么是WebService?
C#转换IList对象数组为byte数组.然后通过WebService传递
ASP.NET修改WebService开发环境的端口
什么是VWDPort? (Virtual WebService Dynamic Port)
修改ASP.Net开发环境下的服务器端口(WebService Server Port)
标签:C# Winform+WebService+三层C/S结构快速开发平台
C# WebService代理类详解
愚公移山 - 已完成高级版纯WebService版
C# WebService异步处理/异步调用详解
其它资料:
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
什么是C/S结构? | C/S框架核心组成部分 | C/S框架-WebService部署图 | C/S框架-权限管理 | C/S结构系统框架 - 5.1旗舰版介绍 | C/S结构系统框架 - 功能介绍 | C/S结构系统框架 - 产品列表 | C/S结构系统框架 - 应用展示(图) | 三层体系架构详解 | C/S架构轻量级快速开发框架 | C/S框架网客户案例 | WebApi快速开发框架 | C/S框架代码生成器 | 用户授权注册软件系统 | 版本自动升级软件 | 数据库底层应用框架 | CSFramework.CMS内容管理系统 |
在线客服
