使用C#实现sql server 2005 和Oracle 数据同步
1.背景:
公司的一个项目进行服务扩展,添加了短信服务平台,实现平台按照预定义的规则给用户主动发送短信和用户点播,两种方式。短信平台需能够接入三网(移动、联通、电信)。目前只接入了移动MAS机。用户点播时发送的短信通过MAS机,发送的内容最后保存在sql serer 2005 数据库的表T 中,然后需要根据用户发送的点播代码给用户返回对应的信息。
用户的信息都在业务系统中,业务系统是Oracle 的数据库。两者都处于同一个局域网之内。由于短信平台是一个产品我们无法进行操作,和项目经理商议后决定将用户发送的信息同步到业务系统核心库(Oracle)表M中,然后使用Oracle 触发器调用Java代码,实现用户响应的短信。
2.C# 实现数据同步:
如图,数据同步的过程:
代码实现过程:
OarcleDB.cs 负责向Oracle insert。
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.OracleClient; using System.Text.RegularExpressions; /* * 描述:oralce 数据库连接管理类 * 作者:jianglong.wei(407782789@qq.com) * 时间:20150107 */ namespace readSqlServer2005 { class OarcleDB { private static string dbUrl = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=000.00.0.0) (PORT=1521)))(CONNECT_DATA=(SERVICE_NAME=hjzx)));Persist Security Info=True;User Id=XXX; Password=XXX"; /// <summary> /// 插入数据 /// </summary> /// <param name="orgAddr">OrgAddr上行短信号码</param> /// <param name="content">SM_Content 上行短信内容</param> /// <param name="time">RecvTime 上行短信发送的时间</param> public static int insert(string orgAddr, string content, string time) { int row = 0; OracleConnection conn = new OracleConnection(dbUrl); conn.Open(); string sql = "insert into sms_jsjl(jsjl,LXSJH,JSNR,JSSJ,CRRQ,CLZT) " + "values('" + Guid.NewGuid() + "','" + orgAddr + "','" + content + "','" + time.ToString() + "','" + DateTime.Now.ToString() + "','0')"; using(OracleCommand comm = new OracleCommand(sql,conn)) { try { row += comm.ExecuteNonQuery(); } catch(Exception e) { Console.WriteLine(e.Message); conn.Close(); } finally { conn.Close(); } } return row; } } }
SqlServerDb.cs,负责实现sql server 205数据库的数据读取,代码实现如下:
using System; using System.Collections.Generic; using System.Text; using System.Data; using System.Data.SqlClient; /* * 描述:sql server 2005 数据库操作 * 作者:jianglong.wei * 时间:2015-1-14 */ namespace readSqlServer2005 { class SqlServerDb { private static string dbUrl = "Data Source=00.00.00.0;Initial Catalog=DB_CustomSMS;User ID=xx;pwd=xxxx!;MultipleActiveResultSets=true"; /// <summary> /// 执行数据同步 /// </summary> public static void execute() { SqlConnection conn = new SqlConnection(dbUrl); conn.Open(); string sql = "select OrgAddr,SM_Content,CONVERT(varchar(50), RecvTime,121) AS RecvTime ,SM_ID from T_TMP WHERE Readed = '0' "; using (SqlCommand comm = new SqlCommand(sql,conn)) { SqlDataReader reader = comm.ExecuteReader(); int rows = 0; try { while (reader.Read()) { //执行Oracle insert rows += OarcleDB.insert(reader.GetString(0), reader.GetString(1), reader.GetString(2)); //执行修改操作,注:修改 update(reader.GetInt32(3), reader.GetString(2)); //执行修改操作,注:修改 } Console.WriteLine("信息:本次同步数据了:" + rows + "条,时间:"+DateTime.Now.ToString()); Console.WriteLine(); rows = 0; } catch(Exception e) { Console.WriteLine(e.Message); reader.Close(); conn.Close(); } finally { reader.Close(); conn.Close(); } } } /// <summary> /// 将已经同步过的数据readed字段修改为1,表示已经同步过了 /// </summary> /// <param name="sm_id"></param> /// <param name="time"></param> private static void update(int sm_id,string time) { SqlConnection conn = new SqlConnection(dbUrl); conn.Open(); string sql = "UPDATE T_TMP SET Readed ='1' WHERE SM_ID ='" + sm_id + "' AND RecvTime = '" + time + "'"; using (SqlCommand comm = new SqlCommand(sql,conn)) { try { comm.ExecuteNonQuery(); } catch(Exception e) { Console.WriteLine(e.Message); conn.Close(); } finally { conn.Close(); } } } } }
经过测试,工具可以正常的使用;第一次使用C#来实现这个功能,各位前辈有更好的实现方式,可分享...