需求:在一个集成平台中有一个主系统使用的是Oralce数据库,子系统使用的SqlServer 数据库,如何让子系统的数据库与主系统的人员同步呢?

思路:通过服务WebService 公开接口

1.与主系统的数据库建立连接

2.获取主系统中的人员信息

3.与子系统中的人员信息对比,不存在的添加,存在不一样的跟新,多余的删除

具体代码如下:

1.建立与Oralce 和SqlServer 数据库的连接

  //Oracle数据库连接
private static DataSet OrcaleTransfrom(string sql)
{
OracleConnection conn = new OracleConnection(""); conn.Open();
var result = new DataSet();
var dbAdapter = new OracleDataAdapter
{
SelectCommand =
new OracleCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText = sql
}
};
dbAdapter.Fill(result);
conn.Close();
dbAdapter.Dispose();
return result;
} //SQL数据库连接
private static DataSet SqlTransfrom(string sql)
{
SqlConnection conn = new SqlConnection("");
conn.Open();
var result = new DataSet();
var dbAdapter = new SqlDataAdapter
{
SelectCommand =
new SqlCommand
{
Connection = conn,
CommandType = CommandType.Text,
CommandText = sql
}
};
dbAdapter.Fill(result);
conn.Close();
dbAdapter.Dispose();
return result;
}

2.建立要同步数据的类:

public class Person
{
public DateTime? Birthday { get; set; }
public string BloodType { get; set; }
public string Code { get; set; }
public string Education { get; set; }
public DateTime? EntryDate { get; set; }
public int Gender { get; set; }
public string Identifier { get; set; }
public bool IsActive { get; set; }
public string Job { get; set; }
public DateTime? LeftDate { get; set; }
public string Mobile { get; set; }
public string Name { get; set; }
public string NativePlace { get; set; }
public string OfficeTel { get; set; }
public string OrgCode { get; set; }
public string Picture { get; set; }
public string Position { get; set; }
public string Email { get; set; }
public string LoginName { get; set; }
public string Password { get; set; }
}

3.获取Oracle的人员信息:

        public string GetPersons()
{
try
{
string sql = "select * from V_ASM_USER where USER_ITR=0";
var PDataSet = OrcaleTransfrom(sql);//获取人员
var perDataSet = PDataSet.Tables[0];
List<Person> personlist = new List<Person>();
for (var i = 0; i < perDataSet.Rows.Count; i++)
{
Person persons = new Person();
persons.Name = perDataSet.Rows[i][1].ToString();//姓名
persons.Gender = perDataSet.Rows[i][4].ToString() == "1" ? 2 : 1;//性别
persons.OrgCode = perDataSet.Rows[i][2].ToString();//部门编码
persons.Code = perDataSet.Rows[i][3].ToString();//工号
persons.Identifier = perDataSet.Rows[i][7].ToString();//身份证号
persons.Email = perDataSet.Rows[i][9].ToString(); //邮箱
persons.LoginName = perDataSet.Rows[i][0].ToString();//登录名
persons.Password = perDataSet.Rows[i][10].ToString();//密码
personlist.Add(persons);
}
XmlSerializer xmlFormat = new XmlSerializer(typeof(List<Person>));
MemoryStream stream = new MemoryStream();
xmlFormat.Serialize(stream, personlist);
stream.Position = 0;
byte[] buffer = new byte[stream.Length];
stream.Read(buffer, 0, buffer.Length);
stream.Flush();
stream.Close();
return Convert.ToBase64String(buffer);
}
catch (Exception ex)
{
throw (new Exception(ex.ToString()));
}
}

更新人员:

 private void UpdatePerson(List<Person> per1, List<Person> per2, List<Person> per3)
{
//日志记录
string logPath = WebConfigurationManager.AppSettings["LogFolder"];
var logger = new Logger(logPath);
logger.Log("--------------开始更新人员!----------------" + DateTime.Now + "------------");
using (var _dbContext = new BaseContext())
{
for (var i = 0; i < per1.Count; i++)
{
var OrgCode = per1[i].OrgCode;
var OrgID = _dbContext.Organizations.FirstOrDefault(o => o.Code == OrgCode);//新增
if (OrgID != null)
{
var newPerson = new Soian.Zhitai.Models.Person()
{
ID = Guid.NewGuid().ToString(),
Code = per1[i].Code,
FullName = per1[i].Name,
Gender = per1[i].Gender,
OrganizationID = OrgID.ID,//通过部门编码获取OrganizationID
CreateDate = DateTime.Now,
Email = per1[i].Email,
Identifier = per1[i].Identifier,
IsOffTheJob = false,
IsStop = false
};
var newUser = new User()
{
ID = Guid.NewGuid().ToString(),
Name = per1[i].LoginName,
Password = per1[i].Password,
PersonID = newPerson.ID,
CreateDate = DateTime.Now
};
_dbContext.Persons.Add(newPerson);
_dbContext.Users.Add(newUser);
_dbContext.SaveChanges();
}
} for (var i = 0; i < per2.Count; i++)
{
var OrgCode = per2[i].OrgCode;
var OrgID = _dbContext.Organizations.FirstOrDefault(o => o.Code == OrgCode);//更新
var Code = per2[i].Code;
if (OrgID != null)
{
var newUpdate = _dbContext.Persons.FirstOrDefault(o => o.Code == Code);
newUpdate.FullName = per2[i].Name;
newUpdate.Gender = per2[i].Gender;
newUpdate.Email = per2[i].Email;
newUpdate.Identifier = per2[i].Identifier;
newUpdate.OrganizationID = OrgID.ID;//通过部门编码获取OrganizationID
var newUser = _dbContext.Users.FirstOrDefault(d => d.PersonID == newUpdate.ID);//更新User
newUser.Name = per2[i].LoginName;
newUser.Password = per2[i].Password;
_dbContext.SaveChanges();
}
} for (var i = 0; i < per3.Count; i++)
{
var Code = per3[i].Code;
var newDelete = _dbContext.Persons.FirstOrDefault(o => o.Code == Code);//删除
if (!string.IsNullOrWhiteSpace(newDelete.ToString()))
{
newDelete.IsStop = true;
} if (_dbContext.Users.FirstOrDefault(d => d.PersonID == newDelete.ID) != null)
{
var newUser = _dbContext.Users.FirstOrDefault(d => d.PersonID == newDelete.ID);//删除User
if (!string.IsNullOrWhiteSpace(newUser.IsStop.ToString()))
{
newUser.IsStop = true;
}
}
_dbContext.SaveChanges();
}
}
logger.Log("--------------更新人员结束!----------------" + DateTime.Now + "------------");
}
 

对比人员:

  //对比人员
private void ComparerSyncPerson(List<Person> infolist, List<Person> LocalPerson)
{
List<Person> localPersonListadd = new List<Person>();//新增数据
List<Person> localPersonListupdate = new List<Person>();//更新数据
List<Person> localPersonListdel = new List<Person>();//删除数据 localPersonListadd = infolist.Where(i => !LocalPerson.Select(local => local.Code).Contains(i.Code)).ToList(); localPersonListupdate = infolist.Where(i => LocalPerson.Select(local => local.Code).Contains(i.Code)).ToList(); localPersonListdel = LocalPerson.Where(i => !infolist.Select(info => info.Code).Contains(i.Code)).ToList(); UpdatePerson(localPersonListadd, localPersonListupdate, localPersonListdel);//执行更新等操作
}

WebService接口(只有管理员有此权限):

 [WebMethod(Description = "人员导入")]
public void GetLocalPersonData()
{
var PersonStr = GetPersons();
byte[] buffer = Convert.FromBase64String(PersonStr);
MemoryStream stream = new MemoryStream(buffer);
XmlSerializer xmlSearializer = new XmlSerializer(typeof(List<Person>));
List<Person> infolist = (List<Person>)xmlSearializer.Deserialize(stream); for (int i = 0; i < infolist.Count(); i++)
{
var SyncCode = (infolist[i].OrgCode).ToString();
infolist[i].OrgCode = GetOrganizationID(SyncCode);
} using (BaseContext _dbContext = new BaseContext())
{
List<Person> LocalPerson = _dbContext.Persons.Where(o => true && o.FullName != "管理员").Select(o => new Person
{
Name = o.FullName,
Gender = o.Gender,
OrgCode = o.OrganizationID,
Code = o.Code,
EntryDate = o.EntryDate
}).ToList();
ComparerSyncPerson(infolist, LocalPerson);//对比及更新
}
}

调用WebService的接口。可以完成数据的跟新。不能每次都进行手工更新,所以,通过配置调度服务进行更新。

 public class RenYuanTongBuJob : IJob
{
public void Execute(IJobExecutionContext context)
{ RenYuanTongBuJobAndZhuZhiJiGouTongBu();
} //实例化服务接口
HSEDataSynchronization hs = new HSEDataSynchronization();
public void RenYuanTongBuJobAndZhuZhiJiGouTongBu()
{
//人员
hs.GetLocalPersonData();
}
}

Quartz定时任务调度的接口以前文章中有。

在Global文件中进行配置。

   private void RegisterJob()
{
QuartzManager<RenYuanTongBuJob>.AddJob("RenYuanTongBu", "0 0 02 ? * *");
}

Oracle与Sqlserver数据共享的更多相关文章

  1. 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗

    ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性:    Oracle.MYSQL与DB2可在所有主流平台上运行:    SQL Server只能在Windows下运行: --安 ...

  2. oracle与sqlserver部分区别

    oracle和sqlserver的区别:1,执行修改操作要接commit,不然数据仅仅只是查看,并不是提交数据2,oracle不能使用select 字段 这种查看方式查看数据:3,oracle存储过程 ...

  3. ORACLE连接SQLSERVER

    一.实验(实验成功) 1.实验目标:ORACLE连接SQLSERVER以及查询数据 2.搭建的环境: oracle 9i 9.0.2.0.1 地址:192.168.40.139 sql2000 的数据 ...

  4. 采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库

    都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的. 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用 ...

  5. Java学习-006-三种数据库连接 MySQL、Oracle、sqlserver

    此文主要讲述在初学 Java 时,常用的三种数据库 MySQL.Oracle.sqlserver 连接的源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源 ...

  6. CTE在Oracle和Sqlserver中使用的差异

    CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...

  7. NUll在oracle与sqlserver中使用相同与区别

    最近在使用Oracle进行开发,遇到很多与以前使用sqlserver的不同语法.今天遇到null在两种数据库上面操作上的差别,在此记录两种数据库上的差异. null 与字符串相加 1.在oracle中 ...

  8. Oracle/Mysql/SqlServer函数区别

    mysql日期和时间格式转换 Linux scp 使用详解 Oracle/Mysql/SqlServer函数区别 2011-07-01 12:34:36|  分类: Mysql技术 |  标签:mys ...

  9. oracle与sqlserver利用函数生成年月日加流水号

    最近在做oracle相关的项目,刚接触oracle,与sqlserver语法上还是有区别的 sqlserver : 示例:FX+当前年月日+00001 如下图流水号实力所示 原理: 首先 'FX'是固 ...

随机推荐

  1. Lowest Common Ancestor in a Binary Tree

    二叉树最低公共祖先节点 acmblog If one key is present and other is absent, then it returns the present key as LC ...

  2. npm 5.4.2 更新后就不能用了

    今天刚,npm run dev 就出现更新提示,没多想就更了, 更新用了49S,下来npm 的所以命令包一个semer的插件 ... 最后下载新node 8.5覆盖安装, 就解决了, node 8.5 ...

  3. Lena与数字图像处理

    在数字图像处理中,Lena(Lenna)是一张被广泛使用的标准图片,特别在图像压缩的算法研究中. 黑白Lena图   标准Lena (为什么用这幅图,是因为这图的各个频段的能量都很丰富:即有低频(光滑 ...

  4. Intellij IDEA设置及快捷键使用总结

    1. IDEA内存优化 先看看你机器本身的配置而配置. \IntelliJ IDEA 8\bin\idea.exe.vmoptions -------------------------------- ...

  5. 小记 百度地图 soso地图 经纬度偏移

    项目里遇到了这么个问题,数据库原有数据是微信上用的,所以是soso地图坐标, 但是现在要做百度地图,坐标偏移严重,网上找了也没说偏移多少,自己手动测试10多分钟,得到个大概值,反正差不多就行了. so ...

  6. 【整理】HTML5游戏开发学习笔记(1)- 骰子游戏

    <HTML5游戏开发>,该书出版于2011年,似乎有些老,可对于我这样没有开发过游戏的人来说,却比较有吸引力,选择自己感兴趣的方向来学习html5,css3,相信会事半功倍.不过值得注意的 ...

  7. Celery异步任务队列/周期任务+ RabbitMQ + Django

    一.Celery介绍和基本使用  Celery 是一个 基于python开发的分布式异步消息任务队列,通过它可以轻松的实现任务的异步处理, 如果你的业务场景中需要用到异步任务,就可以考虑使用celer ...

  8. Dream------Hadoop--HDFS的设计

    HDFS是为以流式数据访问模式存储超大文件而设计的文件系统.   流式数据访问 HDFS建立在这样一个思想上:一次写入.多次读取模式是最高效的.一个数据集通常由数据源生成或复制, 接着在此基础上进行各 ...

  9. NuGet服务器搭建教程

    本文主要来自网络,进行整理而成,相关文章如下: http://diaosbook.com/Post/2012/12/15/setup-private-nuget-server https://www. ...

  10. Django-ORM简介

    ORM简介 MVC框架中包括一个重要的部分,就是ORM,它实现了数据模型与数据库的解耦,即数据模型的设计不需要依赖于特定的数据库,通过简单的配置就可以轻松更换数据库 ORM是“对象-关系-映射”的简称 ...