需求:在一个集成平台中有一个主系统使用的是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. linux kill 掉所有匹配到名字的进程

    如,要 kill 掉 swoole 相关的进程 ps aux | grep swoole |  awk '{print $2}' | xargs kill -9 ps 列出所有进程, 参数: a -  ...

  2. Ansible lineinfile模块详解

    目录 简介 修改匹配行 在匹配行前或后添加内容 在匹配行前添加 在匹配行后添加 修改文件内容及权限 删除一行内容 文件存在则添加一行内容 如果有匹配的行则修改该行,如果不匹配则添加 参数backref ...

  3. [Java]-Java的版本演化

    一.Java SE 8 Java SE 8发行于2014年3月18日,代号culture,这是一个在Java历史上的重大发布 Java SE 8 新特性: Lambda Expressions(Lam ...

  4. webapi框架搭建-安全机制(一)

    本系列博客链接:webapi框架搭建系列博客 前言 webapi接口是开放给外部使用的,包括接口的地址,传参的规范,还有返回结果的说明.正因为接口的开放性,使得接口的安全很重要.试想一下,用抓包工具( ...

  5. [洛谷P3292] [SCOI2016]幸运数字

    洛谷题目链接:[SCOI2016]幸运数字 题目描述 A 国共有 n 座城市,这些城市由 n-1 条道路相连,使得任意两座城市可以互达,且路径唯一.每座城市都有一个幸运数字,以纪念碑的形式矗立在这座城 ...

  6. ZeroMQ API(五) 传输模式

    1.使用TCP的单播传输:zmq_tcp(7) 1.1 名称 zmq_tcp - 使用TCP的ZMQ单播传输 1.2 概要 TCP是一种无处不在,可靠的单播传输.当通过具有ZMQ的网络连接分布式应用程 ...

  7. Java并发编程原理与实战二十:线程安全性问题简单总结

    一.出现线程安全性问题的条件 •在多线程的环境下 •必须有共享资源 •对共享资源进行非原子性操作   二.解决线程安全性问题的途径 •synchronized (偏向锁,轻量级锁,重量级锁) •vol ...

  8. 24点扑克牌游戏——(含java源码)(GUI实现)

    给出四个数字,要求,在其间添加运算符和括号,使得计算结果等于24. 括号的放置即为决定哪几个数先进行计算.所以,我们先确定首先进行计算的两个相邻的数,计算完成后,就相当于剩下三个数字,仍需要在它们之间 ...

  9. 【leetcode 简单】 第六十四题 翻转二叉树

    翻转一棵二叉树. 示例: 输入: 4 / \ 2 7 / \ / \ 1 3 6 9 输出: 4 / \ 7 2 / \ / \ 9 6 3 1 备注: 这个问题是受到 Max Howell的 原问题 ...

  10. Nginx服务优化详解

    Nginx服务优化详解 1.隐藏Nginx版本信息 编辑主配置文件nginx.conf,在http标签中添加代码 server_tokens off;来隐藏软件版本号. 2.更改Nginx服务启动的默 ...