使用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#来实现这个功能,各位前辈有更好的实现方式,可分享...

 

posted @ 2015-01-20 12:03  jianglongwei  阅读(565)  评论(0编辑  收藏  举报