Oracle与Sqlserver数据共享
需求:在一个集成平台中有一个主系统使用的是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数据共享的更多相关文章
- 你搞懂 ORACLE、 SQLSERVER、MYSQL与DB2的区别了吗
ORACLE. SQLSERVER.MYSQL与DB2的区别--平台性: Oracle.MYSQL与DB2可在所有主流平台上运行: SQL Server只能在Windows下运行: --安 ...
- oracle与sqlserver部分区别
oracle和sqlserver的区别:1,执行修改操作要接commit,不然数据仅仅只是查看,并不是提交数据2,oracle不能使用select 字段 这种查看方式查看数据:3,oracle存储过程 ...
- ORACLE连接SQLSERVER
一.实验(实验成功) 1.实验目标:ORACLE连接SQLSERVER以及查询数据 2.搭建的环境: oracle 9i 9.0.2.0.1 地址:192.168.40.139 sql2000 的数据 ...
- 采用Hibernate框架的研发平台如何能够真正兼容Oracle和sqlServer数据库
都说Hibernate框架的使用可以很容易的让你的研发平台支持多种不同类型的数据库,但实践表明,这里的“容易”,是相对的. 想让研发平台支持多种数据库,并不是一件简单的事,也可以这么说:并不是只要使用 ...
- Java学习-006-三种数据库连接 MySQL、Oracle、sqlserver
此文主要讲述在初学 Java 时,常用的三种数据库 MySQL.Oracle.sqlserver 连接的源代码整理.希望能对初学 Java 编程的亲们有所帮助.若有不足之处,敬请大神指正,不胜感激!源 ...
- CTE在Oracle和Sqlserver中使用的差异
CTE是一个很好用的工具,他可以帮助我们清晰代码结构,减少临时表使用,同时oracle和sqlserver都提供支持.但在oracle和sqlserver中使用CTE也存在一定区别. Oracle使用 ...
- NUll在oracle与sqlserver中使用相同与区别
最近在使用Oracle进行开发,遇到很多与以前使用sqlserver的不同语法.今天遇到null在两种数据库上面操作上的差别,在此记录两种数据库上的差异. null 与字符串相加 1.在oracle中 ...
- Oracle/Mysql/SqlServer函数区别
mysql日期和时间格式转换 Linux scp 使用详解 Oracle/Mysql/SqlServer函数区别 2011-07-01 12:34:36| 分类: Mysql技术 | 标签:mys ...
- oracle与sqlserver利用函数生成年月日加流水号
最近在做oracle相关的项目,刚接触oracle,与sqlserver语法上还是有区别的 sqlserver : 示例:FX+当前年月日+00001 如下图流水号实力所示 原理: 首先 'FX'是固 ...
随机推荐
- 【Asp.net入门2-01】C#基本功能
C#是一种功能强大的语言,但并不是所有程序员都熟悉我们将在本书中讨论的所有功能.因此, 本章将介绍优秀的Web窗体程序员需要了解的C#语言功能. 本章仅简要介绍每一项功能.有关C#语言本身的知识不是本 ...
- NATS_02:NATS消息通信模型
消息通信模型 NATS的消息通信是这样的:应用程序的数据被编码为一条消息,并通过发布者发送出去:订阅者接收到消息,进行解码,再处理.订阅者处理NATS消息可以是同步的或异步的. * 异步处理 异步处 ...
- Java5的新特性
原文出处:xixicat 序 这是Java语言特性系列的第一篇,从java5的新特性开始讲起.初衷就是可以方便的查看语言的演进历史. 特性列表 泛型 枚举 装箱拆箱 变长参数 注解 foreach循环 ...
- RCNN,fast R-CNN,faster R-CNN
转自:https://www.cnblogs.com/skyfsm/p/6806246.html object detection我的理解,就是在给定的图片中精确找到物体所在位置,并标注出物体的类别. ...
- bzoj千题计划170:bzoj1968: [Ahoi2005]COMMON 约数研究
http://www.lydsy.com/JudgeOnline/problem.php?id=1968 换个角度 一个数可以成为几个数的约数 #include<cstdio> #incl ...
- 数学建模 TSP(旅行商问题) Lingo求解
model: sets: cities../:level; link(cities, cities): distance, x; !距离矩阵; endsets data: distance ; end ...
- nodejs压缩
在express中要用到压缩,把某一个文件夹压缩成zip,再返回到客户端提供下载. 用archiver库 var Archiver = require('archiver') router.get(' ...
- 最佳的MongoDB客户端管理工具
<最佳的MongoDB客户端管理工具> 作者:chszs,未经博主允许不得转载.经许可的转载需注明作者和博客主页:http://blog.csdn.net/chszs 一个好的MongoD ...
- 在WindowsServer2008服务器上安装SQLServer2008R2 Express版
登录服务器 使用远程桌面登录Windows Server 2008 安装前的准备工作 下载SQL Server安装程序 下载Microsoft SQL Server2008 R2 RTM - Ex ...
- 20155316 2016-2017-2 《Java程序设计》第7周学习总结
教材学习内容总结 1. 时间与日期 1.1 时间的度量 GMT -> UT -> TAI -> UTC 英文 缩写 Greenwich Mean Time GMT Universal ...