作为一个完整的整体信息化解决方案需要有足够强大的各种功能,这些功能相对独立,又互相依存。当有需要这样的功能时可以随时拿出来用,适当修改一下就可以满足要求。只有这样才能快速开发各种信息化系统,才能满足各种客户的需求。

同步数据需要解决的问题主要有:

01:全国性大型集团公司的信息化改造项目会涉及到非常多的分公司网点的客户端需要同步数据的各种需求,这个已经超越了人工能处理好的极限。
02:网点非常多时,往往由于业务的特殊性会有能离线作业的需要,网络故障、网络带宽不理想时都可以进行离线处理的工作流程需要。
03:也由于网络安全原因、工作特殊原因,必须有些数据需要在本地网络里处理好,然后通过特殊专线等进行定时上传上报业务数据。
04:手持移动设备等、由于工作环境没有实时的互联网条件、可能也需要在离线条件下处理好数据,连接上网络时再把数据上传到总部。
05:有从大型数据库同步到桌面数据库的需要,例如服务器是SQLServer的、客户端是SQLite的。
06:也有可能是服务器与服务器之间的数据同步,例如生产主要数据库同步到统计数据库,同步到查询数据库里。
07:服务器上的总部数据库可能很庞大,每个网点可能只需要同步部分数据库,甚至是特殊限制的sql语句获取的数据部分需要同步。
08:若需要同步的数据比较多时,由于网络带宽、服务器的稳定性考虑,需要有提供批次获取数据的功能,可以分批获取数据。
09:表结构有变动时;有增加、有减少、有变更是、不要有问题故障发生;可以平稳升级、可以平稳同步数据。
10:若有上万信息终端,若没有数据就不需要进行任何sql语句查询了,减轻中心数据库查询压力。
11:可以访问的库、允许同步的表进行权限控制,防止越权获取不应该看到的数据。
12:接口调用的安全性保证、如何防止恶意调用等,对一个对外开放的接口,这些都需要考虑风险。
13:升级同步还可以能灵活扩展、能执行SQL语句,能编写C#逻辑控制代码。
14:同步程序可以在后台进行、不影响主要业务功能、不影响业务操作。
15:代码简洁、好维护、好调试、好改进,好快速增加同步额外的数据表等。

参考代码如下:

//-----------------------------------------------------------------
// All Rights Reserved , Copyright (C) 2015 , Hairihan TECH, Ltd.
//----------------------------------------------------------------- using System;
using System.Collections.Specialized;
using System.Data;
using System.Net;
using System.Text;
using Newtonsoft.Json; namespace DotNet.Win
{
using DotNet.Business;
using DotNet.Utilities; /// <summary>
/// 数据同步类
/// </summary>
public partial class Synchronous
{
/// <summary>
/// 远程数据同步的工具类
/// </summary>
/// <param name="fromDataBase">从服务器的哪个数据库获取数据</param>
/// <param name="tableName">同步哪个表</param>
/// <param name="primaryKeys">表的主键是什么</param>
/// <param name="modifiedOn">同步的更新时间</param>
/// <param name="toDataBaseDbType">同步到本地什么类型的数据库里?</param>
/// <param name="dbConnection">同步的目标数据库连接方式?</param>
/// <returns>影响行数</returns>
public static int SynchronousTable(string fromDataBase, string tableName, string[] primaryKeys, DateTime? modifiedOn, CurrentDbType toDataBaseDbType, string dbConnection)
{
int result = 0;
// 输入参数检查
if (primaryKeys == null)
{
return result;
} int topLimit = 200; DataTable dataTable = null;
IDbHelper dbHelper = null; dbHelper = DbHelperFactory.GetHelper(toDataBaseDbType, dbConnection);
SQLBuilder sqlBuilder = new SQLBuilder(dbHelper);
while (topLimit == 200)
{
string url = BaseSystemInfo.WebHost + "WebAPIV42/API/Synchronous/GetTopLimitTable";
WebClient webClient = new WebClient();
NameValueCollection postValues = new NameValueCollection();
postValues.Add("userInfo", BaseSystemInfo.UserInfo.Serialize());
postValues.Add("systemCode", BaseSystemInfo.SystemCode);
postValues.Add("securityKey", BaseSystemInfo.SecurityKey);
postValues.Add("dataBase", fromDataBase);
postValues.Add("tableName", tableName);
postValues.Add("topLimit", topLimit.ToString());
postValues.Add("modifiedOn", modifiedOn.Value.ToString(BaseSystemInfo.DateTimeFormat));
// 向服务器发送POST数据
byte[] responseArray = webClient.UploadValues(url, postValues);
string response = Encoding.UTF8.GetString(responseArray);
if (!string.IsNullOrEmpty(response))
{
dataTable = (DataTable)JsonConvert.DeserializeObject(response, typeof(DataTable));
}
int r = 0;
// 出错的日志都需要能保存起来,这样有问题的可以找出原因来。
for (r = 0; r < dataTable.Rows.Count; r++)
{
// 先删除数据,修改的、新增的、都删除后添加来处理,问题就简单化了
// dbHelper.ExecuteNonQuery("DELETE FROM " + tableName + " WHERE " + primaryKey + " = '" + dataTable.Rows[r][primaryKey].ToString() + "'");
sqlBuilder.BeginDelete(tableName);
for (int i = 0; i < primaryKeys.Length; i++)
{
string primaryKey = primaryKeys[i];
if (string.IsNullOrWhiteSpace(primaryKey))
{
sqlBuilder.SetWhere(primaryKey, dataTable.Rows[r][primaryKey].ToString());
}
}
sqlBuilder.EndDelete(); // 然后插入数据
sqlBuilder.BeginInsert(tableName);
for (int i = 0; i < dataTable.Columns.Count; i++)
{
// 这里能判断目标表里是否有这个字段存在就更完美了。
sqlBuilder.SetValue(dataTable.Columns[i].ColumnName, dataTable.Rows[r][dataTable.Columns[i].ColumnName]);
}
sqlBuilder.EndInsert();
if (DateTime.Parse(dataTable.Rows[r][BaseBusinessLogic.FieldModifiedOn].ToString()) > modifiedOn.Value)
{
modifiedOn = DateTime.Parse(dataTable.Rows[r][BaseBusinessLogic.FieldModifiedOn].ToString());
}
result++;
}
topLimit = dataTable.Rows.Count;
}
return result;
}
}
}

C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 大型软件系统客户端数据同步的问题解决的更多相关文章

  1. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除

    客户的需求如下: 所有基礎信息需要記錄創建人,創建時間,更改人,更改時間,刪除人,刪除時間.有停用基礎信息功能(停用不是刪除,只是暫時停用).基礎信息可以查出已經刪除的信息(有選項可以選擇),有方法把 ...

  2. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理

    C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理 当公司有几万人,上千家加盟网点,几个庞大的直属分公司后,系统账户的有效管理也是一个头疼的问题,把所有的帐户及时进行科学 ...

  3. C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 面向数据库SQL语句的应用开发二

    很多传统企业.包括系统集成类的IT企业,若不是从事专业软件开发领域的,能做出一套适合本公司企业信息化的灵活的信息系统还是很有难度的,还有一些已经多年不写程序的资深开发人员,初学者,都难把一个整套系统实 ...

  4. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 适合大型企业信息化应用使用的角色权限管理体系

    每个人外表看看都没什么大区别.但是内在的知识.处理问题的能力.解决问题的能力.头脑灵活性都会有很大的差距.软件组件也是一样,有些组件编写厉害,想问题深入,能处理的难题也多,构思巧妙. 通用快速开发平台 ...

  5. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享

    由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ...

  6. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 基于数据库资源的多语言实现

    以前的开发平台里,是用xml语言包实现了多语言功能,现在新的平台里进行了调整,把多语言包资源放在数据库表里实现了. 我们系统预留了多语言的配置全局变量.可以通过配置这个参数达到切换多语言的目的 我们在 ...

  7. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题

    庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...

  8. C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 面向全国标准省市县行政数据基础之上的组织机构管理

    由于信息系统庞大.各种业务子系统.各种开发语言开发的业务逻辑.各种年代维护的代码.各种参差不齐的历史遗留信息系统,面向全国的业务系统,面向某个领域的汽运管理信息系统,面向内部的业务系统,面向外部的各种 ...

  9. C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 如何才能成为全国知名软件组件

    往往我们看到一个好用的工具.就能知道制作这个工具有多少不容易,使用好这个工具也有多少不容易? 通用快速开发框架同样也是经过多年的完善改进才到了今天的稳定成熟度,知名程度,为什么能成为全国有名的软件组件 ...

随机推荐

  1. web前端交互性易用性说明

    总结一下我们在web前端开发过程中总是强调交互性.易用性的情况分析说明.个人觉得web前端的易用交互也就是我们所说人性化操作.不外乎希望达到的效果为:界面风格简洁明了.重点突出:操作简单,直观可见.当 ...

  2. Linux安全基础:find命令的使用

    find 命令用于查找文件系统中的指定文件. *命令格式:find pathname -option [-print -exex -ok] 1.pathname要查找的目录路径 ~表示home目录 . ...

  3. SharePoint 2013 托管导航及相关配置 <二>

    本文的思路是使用JQuery重写SharePoint自带托管导航的样式,其实思路和脚本都非常简单,引用一下JQuery脚本,然后重写导航的样式,把脚本放到母版页中,即可.当然,使用JQuery可以做很 ...

  4. [SharePoint]SharePoint Claim base Authentication的一个比较好的介绍

    User identity in AD DS is based on a user account. For successful authentication, the user provides ...

  5. Sharepoint学习笔记—习题系列--70-576习题解析 -(Q121-Q123)

    Question  121 You are designing a SharePoint 2010 workflow that will be used to monitor invoices. Th ...

  6. AFNetworking 3.0 断点续传 使用记录

    最近项目中用到了压缩包下载,使用AFNetworking 3.0 下载压缩包 支持断点续传 代码如下: #import "HDInternet_handler.h" #import ...

  7. 【原】Github系列之二:开源 一行代码实现多形式多动画的推送小红点WZLBadge(iOS)

    更新日志 V1.2 2015.09.25 1.UITabBarItem badge is supproted; 2.Enable change badge properties when badge ...

  8. 从tabBarController的一个item上的控制器跳转到另一个item上的控制器

    先从习惯性的tabBarController开始,很多应用的外框都是用这个开始的,而从tabBarController的一个item上的控制器跳转到另一个上的,往往都是直接通过点击tabBar上的不同 ...

  9. [css]我要用css画幅画(九) - Apple Logo

    接着之前的[css]我要用css画幅画(八) - Hello Kitty,这次画的是苹果公司的logo 这次打算将分析和实现步骤尽量详细的说一说. 其实之前的也打算详细讲分析和设计过程,不过之前的图比 ...

  10. Coding道场:第一次

    10/23日,我在部门内部进行了一次内部学习,使用目前流行的Coding Dojo(道场)方式,进行了TDD开发的演练.演练的题目如下:     有关Coding道场的介绍,请自行百度一下,我就不再多 ...