需求:在一个集成平台中有一个主系统使用的是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. body内常用标签

    一.标签内使用的符号 # 特殊字符   空格 > 大于 < 小于 更多特殊字符:Here 二.P标签 作用:p标签表示段落 <body> <p>  吃葡萄不吐葡萄皮 ...

  2. Docker简介和安装(一)

    Docker简介 Docker 是 Docker.Inc 公司开源的一个基于 LXC技术之上构建的Container容器引擎, 源代码托管在 GitHub 上, 基于Go语言并遵从Apache2.0协 ...

  3. U45490 还没想好名字的题Ⅱ

    这一题的环状板 Solution 暴力断环为链, 枚举起点跑 \(n\) 遍 \(DP\), 取最小值即可 Code #include<iostream> #include<cstd ...

  4. JavaScript中的arguments详解

    1. arguments arguments不是真正的数组,它是一个实参对象,每个实参对象都包含以数字为索引的一组元素以及length属性. (function () { console.log(ar ...

  5. linux网卡的开启

    一:文件配置网卡在开机时,自动启用 首先我们使用 ip addr查看IP信息 [root@redhat2 network-scripts]# ip addr : lo: <LOOPBACK,UP ...

  6. 安装解压版的mariadb

    今天尝试了安装解压版的mariadb,在官网上https://downloads.mariadb.org/下载了5.5版本的mariadb的zip压缩包, 经过实践发现mariadb解压版安装与mys ...

  7. Java实现各种内部排序算法

    数据结构中常见的内部排序算法: 插入排序:直接插入排序.折半插入排序.希尔排序 交换排序:冒泡排序.快速排序 选择排序:简单选择排序.堆排序 归并排序.基数排序.计数排序 直接插入排序: 思想:每次将 ...

  8. iOS6下实现滑动返回

    [转载请注明出处] 之前在看iOS7滑动返回时,发现了一个iOS6 SDK下的第三方实现,今天偶然间发现了作者在其博客上对该实现的一些心得,读来深觉之前的思考太过肤浅,许多实际的问题没有考虑到.帖子链 ...

  9. linux命令-grep+正则表达式用法

    目标文件/etc/passwd,使用grep命令或egrep 1.显示出所有含有root的行:egrep 'root' passwd 2.输出任何包含bash的所有行,还要输出紧接着这行的上下各两行的 ...

  10. opencv 摄像头

    VideoCapture cap(); if(!cap.isOpened()) ; Mat frame, edges; namedWindow(); for(;;) { cap >> fr ...