WebService架构提交数据-生成仅包含修改了字段的数据表
WebService架构提交数据-生成仅包含修改了字段的数据表
示范程序截图:
FieldChangedObserver示范程序截图
观察两个数据表:
扫一扫加作者微信
Source code free download!
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!
版权声明:本文为开发框架文库发布内容,转载请附上原文出处连接
NewDoc C/S框架网