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

  • 相关阅读:
    Linux系统自带服务罗列
    几个有用的shell命令
    Zabbix
    RaspberryPi3安装CentOS7教程
    grafana简介
    负载均衡之Haproxy配置详解(及httpd配置)
    CentOS7版本的新特性
    文件系统目录结构
    openstack部署dashboard
    openstack核心组件--cinder存储服务(6)
  • 原文地址:https://www.cnblogs.com/jianglongwei/p/4216430.html
Copyright © 2011-2022 走看看