服务器上保存有上万条的基础数据,需要同步到全国各地的成千上万个客户端,而且这些基础数据也经常在有变化调整。这时候需要有一个稳定的数据同步程序,能分批同步基础数据,由于网络流量,网络的稳定性等因素,需要分批读取有更新过的数据,花费了半天时间写了一个例子代码,客户端同步从服务器上同步基础数据的功能,可以提供给大家参考一下,希望能有重复利用的价值。

  1. // 1:打开业务数据库
  2. SqLiteHelper dbHelper = new SqLiteHelper(BaseSystemInfo.BusinessDbConnection);
  3. // 2: 先保存个同步时间标志,什么时间成功同步过本地数据库?这样不用每次都同步所有的数据,只同步那个时间之后的数据就可以了。
  4. BaseParameterManager parameterService = new BaseParameterManager(dbHelper, BaseSystemInfo.UserInfo);
  5. // 3:用参数的方式读取同步时间
  6. string synchronous = parameterService.GetParameter("System", BaseOrganizeEntity.TableName, "Synchronous");
  7. // 4: 传递参数用的,为了防注入漏洞的
  8. List<KeyValuePair<string, object>> dbParameters = new List<KeyValuePair<string, object>>();
  9. // 5:只获取有效的,未被删除的数据,(数据有被删除,也应该能同步才可以)
  10. string whereConditional = string.Empty;
  11. // string whereConditional = BaseOrganizeEntity.FieldDeletionStateCode + " = 0 AND " + BaseOrganizeEntity.FieldEnabled + " = 1 ";
  12. int recordCount = ;
  13. int pageIndex = ;
  14. // 网络情况好,客户端少,每次多获取一些数据,网络情况糟糕每次少获取一些数据
  15. int pageSize = ;
  16. // 6:不需要获取所有数据,在最大程度上减少网络上的数据流量
  17. string selectField = BaseOrganizeEntity.FieldId + ","
  18. + BaseOrganizeEntity.FieldCode + ","
  19. + BaseOrganizeEntity.FieldFullName + ","
  20. + BaseOrganizeEntity.FieldEnabled + ","
  21. + BaseOrganizeEntity.FieldDeletionStateCode;
  22.  
  23. int pageCount = ;
  24. if (!string.IsNullOrEmpty(synchronous))
  25. {
  26. DateTime modifiedOn = DateTime.Parse(synchronous);
  27. dbParameters.Add(new KeyValuePair<string, object>(BaseOrganizeEntity.FieldModifiedOn, modifiedOn));
  28. if (!string.IsNullOrEmpty(whereConditional))
  29. {
  30. whereConditional += " AND ";
  31. }
  32. // 7:只获取上次同步之后修改过的数据
  33. whereConditional += BaseOrganizeEntity.FieldModifiedOn + " > " + DbHelper.GetParameter(BaseOrganizeEntity.FieldModifiedOn);
  34. }
  35. // 8:调用远程服务,获取需要同步的数据
  36. DotNetService dotNetService = new DotNetService();
  37. DataTable dtSynchronous = dotNetService.UserCenterDbHelperService.GetDataTableByPage(BaseSystemInfo.UserInfo, out recordCount, BaseOrganizeEntity.TableName, selectField, pageIndex, pageSize, whereConditional, dbParameters, BaseOrganizeEntity.FieldId);
  38. // 9:防止网络连接超时,把网络连接释放掉
  39. if (dotNetService.UserCenterDbHelperService is ICommunicationObject)
  40. {
  41. ((ICommunicationObject)dotNetService.UserCenterDbHelperService).Close();
  42. }
  43. // 取得总页数
  44. if (recordCount % pageSize == )
  45. {
  46. pageCount = recordCount / pageSize;
  47. }
  48. else
  49. {
  50. pageCount = recordCount / pageSize + ;
  51. }
  52. BaseOrganizeManager organizeManager = null;
  53. // 10:按每页进行循环获取,也防止数据库连接超时,网络连接超时,每次获取一部分数据
  54. while (dtSynchronous != null && dtSynchronous.Rows.Count > )
  55. {
  56. BaseOrganizeEntity organizeEntity = null;
  57. // 11:防止本地数据库连接超时,每次重新打开一个数据库连接,这样保险一些
  58. organizeManager = new BaseOrganizeManager(dbHelper, BaseSystemInfo.UserInfo);
  59. foreach (DataRow dr in dtSynchronous.Rows)
  60. {
  61. // 12:不用实体化其实也可以的,先实体化吧,代码规范一些
  62. organizeEntity = new BaseOrganizeEntity();
  63. organizeEntity.Id = int.Parse(dr[BaseOrganizeEntity.FieldId].ToString());
  64. organizeEntity.Code = dr[BaseOrganizeEntity.FieldCode].ToString();
  65. organizeEntity.FullName = dr[BaseOrganizeEntity.FieldFullName].ToString();
  66. organizeEntity.Enabled = int.Parse(dr[BaseOrganizeEntity.FieldEnabled].ToString());
  67. organizeEntity.DeletionStateCode = int.Parse(dr[BaseOrganizeEntity.FieldDeletionStateCode].ToString());
  68. // 13: 先按更新操作。
  69. SQLBuilder sqlBuilder = new SQLBuilder(dbHelper);
  70. sqlBuilder.BeginUpdate(BaseOrganizeEntity.TableName);
  71. sqlBuilder.SetValue(BaseOrganizeEntity.FieldCode, organizeEntity.Code);
  72. sqlBuilder.SetValue(BaseOrganizeEntity.FieldFullName, organizeEntity.FullName);
  73. sqlBuilder.SetValue(BaseOrganizeEntity.FieldEnabled, organizeEntity.Enabled);
  74. sqlBuilder.SetValue(BaseOrganizeEntity.FieldDeletionStateCode, organizeEntity.DeletionStateCode);
  75. sqlBuilder.SetWhere(BaseOrganizeEntity.FieldId, organizeEntity.Id);
  76. if (sqlBuilder.EndUpdate() == )
  77. {
  78. // 14: 若没找到数据,进行插入操作。
  79. sqlBuilder.BeginInsert(BaseOrganizeEntity.TableName);
  80. sqlBuilder.SetValue(BaseOrganizeEntity.FieldId, organizeEntity.Id);
  81. sqlBuilder.SetValue(BaseOrganizeEntity.FieldCode, organizeEntity.Code);
  82. sqlBuilder.SetValue(BaseOrganizeEntity.FieldFullName, organizeEntity.FullName);
  83. sqlBuilder.SetValue(BaseOrganizeEntity.FieldEnabled, organizeEntity.Enabled);
  84. sqlBuilder.SetValue(BaseOrganizeEntity.FieldDeletionStateCode, organizeEntity.DeletionStateCode);
  85. sqlBuilder.EndInsert();
  86. }
  87. // 15: 这个代码是按实体进行更新同步的代码例子。
  88. // 若有缺少字段什么的,也闹心
  89. // if (organizeManager.UpdateObject(organizeEntity) == 0)
  90. // {
  91. // organizeManager.AddObject(organizeEntity);
  92. // }
  93. }
  94. // 16: 看是否有必要继续获取数据,判断页数,若没必要能少循环一次就少循环一次
  95. dtSynchronous = null;
  96. if (pageIndex < pageCount)
  97. {
  98. // 17: 若数据没获取好,继续获取数据
  99. pageIndex++;
  100. dotNetService = new DotNetService();
  101. dtSynchronous = dotNetService.UserCenterDbHelperService.GetDataTableByPage(BaseSystemInfo.UserInfo, out recordCount, BaseOrganizeEntity.TableName, selectField, pageIndex, pageSize, whereConditional, dbParameters, BaseOrganizeEntity.FieldId);
  102. if (dotNetService.UserCenterDbHelperService is ICommunicationObject)
  103. {
  104. ((ICommunicationObject)dotNetService.UserCenterDbHelperService).Close();
  105. }
  106. }
  107. }
  108. // 18: 更新数据库中的同步时间标志。
  109. parameterService.SetParameter("System", BaseOrganizeEntity.TableName, "Synchronous", DateTime.Now.ToString(BaseSystemInfo.DateTimeFormat));

C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 远程同步服务器大量基础数据到客户端的更多相关文章

  1. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 主管可以看下属的数据

    主管可以看下属的数据,这个是经常用到的一个权限,不管是大公司,还是小公司都需要的功能. 通过以下2个方法,可以任意达到想要的效果了,设置简单灵活,还能递归运算下属,有时候简单好用就是硬道理. #reg ...

  2. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - .NET商业化成品成熟各种数据权限的需求对应例子代码

    还是我上次提出的那个问题问题:假设一个订单表,1.角色A可以看自己的2.角色B可以看工作组的3.角色C可以看金额是1000元以下的(自定义条件是否可行?如果可以,请详细说明)4.角色D可以看整个部门的 ...

  3. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 区域管理功能增强(电子商务方向)

    由于公司是面向全国服务的.全国各地都有分公司,需要管理到覆盖全国的各种业务,各种业务系统信息系统的数据都需要规范化. 公司开展网络订单功能,在全国范围内实现网络下单.提高工作效率,提高各公司之间的数据 ...

  4. C#.NET 大型通用信息化系统集成快速开发平台 4.6 版本 - SSO单点登录接口

    当开发的系统多了.用户多了.合作伙伴多了.对接厂商多了.开发人员多了.部署的服务器也多了,各种安全问题就暴露出来了. 如何安全的把这些系统集成在一起?实现集群的单点登录.严格统一的用户安全体系管理? ...

  5. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 树形选择项目的标准例子

    用成套的现成的方法引导大家开发程序,整个团队的开发效率会很高.例如我们现在有30多个开发人员,若有300个开发人员,这开发工作很容易乱套,我们需要有效的管理维护所有团队的开发工作.把数据结构.通用的组 ...

  6. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 省市区数据权限的实现效果

    折腾了2-3周,终于把全国网点数据权限,省.市.县数据规范化,查询权限规范化,基础数据规范化的思路理清楚了, 今天应该是一个里程碑式的一天 省市区数据规范化后 1:网点的基础数据可以更加严谨规范化. ...

  7. C#.NET 大型通用信息化系统集成快速开发平台 4.0 版本 - 标准省市县数据的公司选择窗口实现

    若全国各地有上千个分公司,加盟店,网点,那就需要一个友善的选择分公司的功能,得有标准的全国省市县的划分数据.这样有了牢靠的基础数据后,才能开发程序得心应手了.当习惯了开发一个公司内部系统时,全国性大公 ...

  8. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 成熟组件化运行效果分解

    1:成熟的组件就是可以写很少的代码,可以实现很多功能.2:又可以用源码方式调用,又可以用dll方式调用.3:不需要学习里面的细节,只要会调用就可以了.4:成熟稳定,功能齐全,bug少,甚至没bug.5 ...

  9. C#.NET 大型通用信息化系统集成快速开发平台 4.1 版本 - 即时消息提醒功能改进

    可以给自己的信息管理系统增加一些即时消息提醒功能,简单方便,一般是一行代码就可以发送提醒信息了,方便二次开发,个性化改进. 1:可以用简拼,快速查找内部员工. 2:双击直接可以发QQ消息. 3:双击直 ...

随机推荐

  1. jQuery用户数字评分效果

    效果预览:http://hovertree.com/texiao/jquery/5.htm HTML文件代码: <!DOCTYPE html> <html xmlns="h ...

  2. js去掉字符串的空格

    //去左空格; function ltrim(s){ return s.replace(/(^s*)/g, ""); } //去右空格; function rtrim(s){ re ...

  3. iOS RunLoop简介

    一.什么是RunLoop? RunLoop是运行循环,每个Cocoa应用程序都由一个处于阻塞状态的do/while循环驱动,当有事件发生时,就把事件分派给合适的监听器,如此反复直到循环停止.处理分派的 ...

  4. ArcGIS安装错误1402

    以前出遇到过在安装ArcGIS软件的时候出现1402错误,错误原因是因为权限不足,具体是什么造成权限不足还不清楚,估计是安装了什么软件后造成. 错误信息 解决方法 找到相应的注册表,在项上右键设置权限 ...

  5. Unable to extract 64-bitimage. Run Process Explorer from a writeable directory

    Unable to extract 64-bitimage. Run Process Explorer from a writeable directory When we run Process E ...

  6. iOS Swift-控制流(The Swift Programming Language)

    iOS Swift-控制流(The Swift Programming Language) for-in 在Swift中for循环我们可以省略传统oc笨拙的条件和循环变量的括号,但是语句体的大括号使我 ...

  7. OC load与initialize

    OC load与initialize load 当类被引用进程序的时候会执行这个函数 一个类的load方法不用写明[super load],父类就会收到调用,并且在子类之前. Category的loa ...

  8. pull解析器: 反序列化与序列化

    pull解析器:反序列化 读取xml文件来获取一个对象的数据 import java.io.FileInputStream; import java.io.IOException; import ja ...

  9. XML语言基础2 DTD

    XML DTD 文档类型定义(DTD)可定义合法的XML文档构建模块.它使用一系列合法的元素来定义文档结构. DTD可被声明于XML文档中,也可以作为一个外部的引用. 内部的DOCTYPE声明 假如D ...

  10. PostgreSQL-数据目录与pg_ctl

    # tail /etc/profile PATH="$PATH":/usr/lib/postgresql/9.2/bin/ export PATH export PGDATA=/v ...