使用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([email protected])
 * 时间: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#来实现这个功能,各位前辈有更好的实现方式,可分享...

时间: 2024-10-29 09:59:28

使用C#实现sql server 2005 和Oracle 数据同步的相关文章

使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历

使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 原文:使用XML向SQL Server 2005批量写入数据——一次有关XML时间格式的折腾经历 常常遇到需要向SQL Server插入批量数据,然后在存储过程中对这些数据进行进一步处理的情况.存储过程并没有数组.列表之类的参数类型,使用XML类型可妥善解决这个问题. 不过,SQL Server2005对标准xml的支持不足,很多地方需要特别处理.举一个例子说明一下. 这个场景是往存储过程里传递一个xml

(转)SQL Server 2005的XML数据修改语言(XML DML) (转自MSDN)

SQL Server 2005的XML数据修改语言(XML DML) 发布日期: 2006-08-14 | 更新日期: 2006-08-14 作者:张洪举 Microsoft MVP 应用于:SQL Server 2005,XML 注:本文章中的内容需要相关的XML和XQuery知识 本页内容 1.insert 2.delete 3.replace 作为对XQuery语言的扩展,XML DML为XML数据操作提供了更大的灵活性,而不再仅仅是对XML数据进行一些查询操作.通过XML DML,用户可

数据仓库应用(三): SQL Server 2005的数据仓库应用--联机分析OLAP

关联文章: 数据仓库应用(一):数据仓库模型设计 数据仓库应用(二):数据抽取.转换.加载(ETL) 前言:有关数据仓库的研究,并不仅仅停留在理论上.目前,几种主要的RDBMS产品,如Oracle.SQL Server.Informix和 Sybase等,都可以为用户提供数据仓库项目的开发工具:而一些通用的应用程序开发平台,如Delphi等,也能对数据仓库项目的开发提供有效的支持.我们将使用Microsoft SQL Server 2005提供的数据仓库工具SSAS对数据仓库中的数据进行OLAP

win7(windows 7)系统下安装SQL2005(SQL Server 2005)图文教程

由于工作需要,今天要在电脑上安装SQL Server 2005.以往的项目都是使用Oracle,MS的数据库还真的没怎么用过,安装Oracle已经轻车熟路,但装SQL Server好像还有点小麻烦,所以记录下来,以留备用. ------------------------------------------------------------------------------------------------- 操作系统:Microsoft Windows 7 旗舰版(32位) 数据库版本:

Using ROW_NUMBER() to paginate your data with SQL Server 2005 and ASP.NET

Jason Witty, 20 Nov 2005 4.67 (23 votes)Rate: vote 1vote 2vote 3vote 4vote 5With the release of SQL Server 2005, Microsoft introduces the long overdue ROW_NUMBER() function. In this article, we will walk through a C# implementation of pagination usin

Sql Server 2005 统计信息用途

1, 什么是统计信息 以下是官方的对统计信息的描述: 按照默认设置,如果表中的某列没有索引,则SQL Server会自动为该列创建统计.然后,查询优化器评估该列中数据分布范围的统计信息,以选择一个更为有效的查询处理方案.分辨自动创建的统计很简单,在SQL Server 7.0和SQL Server 2000中,自动创建的统计的前缀为_WA_Sys. 个人感想: 以前对_WA_Sys开头的统计信息一直不知道有什么用,在学习了oracle时的CBO和三个算法(嵌套循环,合并连接和hash连接)才发现

回首经典的SQL Server 2005

原创文章转载请注明出处:@协思, http://amwicfai.cnblogs.com SQL Server是我使用时间最长的数据库,算起来已经有10年了.上世纪90年代,微软在软件开发的所有领域高歌猛进,形成了操作系统.办公软件.企业开发.游戏制作.浏览器各领域的全线垄断.那曾经是微软发展的黄金时期,至到今天,它仍然在享受着当年的红利. 在SQL Server 2000那个年代,由其功能强大,使用方便,“国人免费”等特点迅速流行起来,成为企业开发的不二选择.早期的用友.管家婆的ERP也使用此

Java如何实时的监控sql server 2005 表的操作

过程描述: 用户发送短信"A"到12329,发送记录会存储在sql server 2005 的记录表T 中,我们需要做的就是根据用户发送的代码"A"给用户返回相应的信息.如图: 考虑过使用触发器,可惜sql server 触发器不能够像Oracle 那样执行Java代码: 考虑使用程序不间断地扫描表,频繁的访问数据库又担心会对sql server 数据库产生太大的压力 各位oscer们,有没有什么好的解决办法?

sql server 2005 怎么看是不是企业版

已经安装了SQL server 2005 怎么确定它是企业版 还是标准版??? 执行sql:SELECT @@VERSION在结果里看,比如我这里是(里面有Enterprise Edition,表示企业版):Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Wind