C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 大型软件系统客户端数据同步的问题解决
作为一个完整的整体信息化解决方案需要有足够强大的各种功能,这些功能相对独立,又互相依存。当有需要这样的功能时可以随时拿出来用,适当修改一下就可以满足要求。只有这样才能快速开发各种信息化系统,才能满足各种客户的需求。
同步数据需要解决的问题主要有:
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 版本 - 大型软件系统客户端数据同步的问题解决的更多相关文章
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 所有的基础数据都可以恢复删除
客户的需求如下: 所有基礎信息需要記錄創建人,創建時間,更改人,更改時間,刪除人,刪除時間.有停用基礎信息功能(停用不是刪除,只是暫時停用).基礎信息可以查出已經刪除的信息(有選項可以選擇),有方法把 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理
C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 – 员工离职管理 当公司有几万人,上千家加盟网点,几个庞大的直属分公司后,系统账户的有效管理也是一个头疼的问题,把所有的帐户及时进行科学 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 面向数据库SQL语句的应用开发二
很多传统企业.包括系统集成类的IT企业,若不是从事专业软件开发领域的,能做出一套适合本公司企业信息化的灵活的信息系统还是很有难度的,还有一些已经多年不写程序的资深开发人员,初学者,都难把一个整套系统实 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 适合大型企业信息化应用使用的角色权限管理体系
每个人外表看看都没什么大区别.但是内在的知识.处理问题的能力.解决问题的能力.头脑灵活性都会有很大的差距.软件组件也是一样,有些组件编写厉害,想问题深入,能处理的难题也多,构思巧妙. 通用快速开发平台 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 几十套业务系统集中统一授权管理实现经验分享
由于这几年互联网电商的快速发展,快递公司也进入了快速发展的绝好快速成长期.随着社会的强劲需求公司的业绩年年攀新高.快速发展的公司都需要有强大的IT信息系统,硬件设备基本上款到了货也可以到了,但是软件系 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 基于数据库资源的多语言实现
以前的开发平台里,是用xml语言包实现了多语言功能,现在新的平台里进行了调整,把多语言包资源放在数据库表里实现了. 我们系统预留了多语言的配置全局变量.可以通过配置这个参数达到切换多语言的目的 我们在 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 能支撑10万以上客户端的数据同步下载问题
庞大的业务系统,特别是需要有离线作业操作支持的核心业务系统,需要有强大的基础数据同步功能,基础数据有在增加.有在变动.有在失效,同时有大量的客户端全天侯的在连接服务器.不间断的在处理核心数据. 经过2 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.2 版本 - 面向全国标准省市县行政数据基础之上的组织机构管理
由于信息系统庞大.各种业务子系统.各种开发语言开发的业务逻辑.各种年代维护的代码.各种参差不齐的历史遗留信息系统,面向全国的业务系统,面向某个领域的汽运管理信息系统,面向内部的业务系统,面向外部的各种 ...
- C#.NET 大型企业信息化系统集成快速开发平台 4.1 版本 - 如何才能成为全国知名软件组件
往往我们看到一个好用的工具.就能知道制作这个工具有多少不容易,使用好这个工具也有多少不容易? 通用快速开发框架同样也是经过多年的完善改进才到了今天的稳定成熟度,知名程度,为什么能成为全国有名的软件组件 ...
随机推荐
- 【工匠大道】一些Vim(Linux)不常见但很逼格的命令(不断更新中)
本文地址 分享提纲: 1. :Tlist 2. :colorscheme 3. :set cursorline 4. ma 5. vim -x 6. CTRL-] 7. 折叠 8. 向别的用户终端写信 ...
- 标准BST二叉搜索树写法
本人最近被各种数据结构的实验折磨的不要不要的,特别是代码部分,对数据结构有严格的要求,比如写个BST要分成两个类,一个节点类,要给树类,关键是所以操作都要用函数完成,也就是在树类中不能直接操作节点,需 ...
- Java Web总结
一.地址 客户端路径和服务端路径 表单:<form action="路径"></form> 超链接:<a href="路径"> ...
- 生成的API分析文件太大。我们无法在交付前验证您的API使用信息。这只是通知信息。
这次使用了APICloud平台来开发移动APP, 发布的时候在api控制台云编译成ipa后,这次使用apple提供的Application Loader工具提交apa文件到iTunes上去,提交结束的 ...
- 浅谈html5 响应式布局
一.什么是响应式布局? 响应式布局是Ethan Marcotte在2010年5月份提出的一个概念,简而言之,就是一个网站能够兼容多个终端——而不是为每个终端做一个特定的版本. 这个概念是为解决移动互联 ...
- Android源码分析之Handler
接上一篇分析,正如Android doc所说,Handler主要有2方面用处: 1. delay执行同一线程中的某个操作,也就是schedule message.runnable在未来的某一时刻执行: ...
- 解决Jenkins 2.0 初始化界面卡住的问题
***************************************** *原创博客转载请注明出处,谢谢!* **************************************** ...
- Play Framework 完整实现一个APP(八)
创建Tag标签 1.创建Model @Entity @Table(name = "blog_tag") public class Tag extends Model impleme ...
- [css]我要用css画幅画(九) - Apple Logo
接着之前的[css]我要用css画幅画(八) - Hello Kitty,这次画的是苹果公司的logo 这次打算将分析和实现步骤尽量详细的说一说. 其实之前的也打算详细讲分析和设计过程,不过之前的图比 ...
- 虚拟机VMware与主机共享文件介绍
我们经常会在Windows平台安装虚拟机VMware,不管是出于实验测试还是工作需要,伴随而来的就是经常需要在Windows系统和虚拟机系统之间进行共享数据文件,例如,需要将Window主机上的Ora ...