C#-SQLServer-跨库数据同步---字符串链接数据库

来源:互联网 发布:两个ip指向一个域名 编辑:程序博客网 时间:2024/06/07 10:20

需求:将A数据库中某个表中的几个字段的数据,同步到B数据库中的某个表中

思路:从xml文件中读取源数据库的信息,目标数据库的信息,然后字符串连接到数据库,先查询出要插入的数据,再插入到目标数据库

过程:xml配置文件,配置文件如下

<?xml version="1.0" encoding="utf-8" ?><config>  <!--源数据库-->  <source_database>    <!--源数据库所在服务器-->    <source_serveraddr></source_serveraddr>    <!--源数据库库名-->    <source_databasename></source_databasename>    <!--源数据库表名-->    <source_tablename></source_tablename>    <!--源数据库userId-->    <source_uid></source_uid>    <!--源数据库password-->    <source_pwd></source_pwd>  </source_database>  <!--目标数据库-->  <target_database>    <!--目标数据库所在服务器-->    <target_serveraddr></target_serveraddr>    <!--目标数据库库名-->    <target_databasename></target_databasename>    <!--目标数据库表名-->    <target_tablename></target_tablename>    <!--目标数据库userId-->    <target_uid></target_uid>    <!--目标数据库password-->      <target_pwd></target_pwd>  </target_database></config>

后台代码:

        public JsonResult DataSynchronized()        {            string path = Server.MapPath("..");            XmlDocument xmlDoc = new XmlDocument();            xmlDoc.Load(path+"../Interface/Interface.xml");//获取到xml文件的路径            XmlNode root = xmlDoc.SelectSingleNode("config");//读取xml根目录            XmlNode sourceXn = root.SelectSingleNode("source_database");//读取源数据库信息            XmlNode sourceServer = sourceXn.SelectSingleNode("source_serveraddr");//读取源数据库地址            XmlNode sourceDatabasename = sourceXn.SelectSingleNode("source_databasename");//读取源数据库库名            XmlNode sourceTablename = sourceXn.SelectSingleNode("source_tablename");//读取源数据库表名            XmlNode sourceUid = sourceXn.SelectSingleNode("source_uid");//读取源数据库账号            XmlNode sourcePwd = sourceXn.SelectSingleNode("source_pwd");//读取源数据库密码            XmlNode targetXn = root.SelectSingleNode("target_database");//读取目标数据库信息            XmlNode targetServer = targetXn.SelectSingleNode("target_serveraddr");//读取目标数据库地址            XmlNode targetDatabasename = targetXn.SelectSingleNode("target_databasename");//读取目标数据库库名            XmlNode targetTablename = targetXn.SelectSingleNode("target_tablename");//读取目标数据库表名            XmlNode targetUid = targetXn.SelectSingleNode("target_uid");//读取目标数据库账号            XmlNode targetPwd = targetXn.SelectSingleNode("target_pwd");//读取目标数据库密码
    //构建链接字符串
            string connsqlSource = "server=" + sourceServer.InnerText + ";database=" + sourceDatabasename.InnerText + ";uid=" + sourceUid.InnerText + ";pwd=" + sourcePwd.InnerText;            string connsqlTarget = "server=" + targetServer.InnerText + ";database=" + targetDatabasename.InnerText + ";uid=" + targetUid.InnerText + ";pwd=" + targetPwd.InnerText;            try            {                using (SqlConnection connSource = new SqlConnection())                {                    using (SqlConnection connTarget = new SqlConnection())                    {                        using (var ts = new TransactionScope())                        {                            connSource.ConnectionString = connsqlSource;                            connSource.Open();//开启源数据库连接                            SqlCommand cmd1 = new SqlCommand("这里查询需要插入的数据,", connSource);                            SqlDataAdapter sda1 = new SqlDataAdapter();                            sda1.SelectCommand = cmd1;                            DataSet ds1 = new DataSet();                            sda1.Fill(ds1, "这里自定义一个表名aaa");                            connTarget.ConnectionString = connsqlTarget;                            connTarget.Open();                            SqlCommand cmd3 = new SqlCommand("这里查询目标数据库的数据", connTarget);                            SqlDataAdapter sda3 = new SqlDataAdapter();                            sda3.SelectCommand = cmd3;                            DataSet ds3 = new DataSet();                            sda3.Fill(ds3, "bbb");                                                        foreach (DataRow theRow in ds1.Tables["aaa"].Rows)                            {                                string sql = "这里根据查询出的源数据条件来删除";                                SqlCommand cmd4 = new SqlCommand(sql, connTarget);                                cmd4.ExecuteNonQuery();                            }                            foreach (DataRow theRow in ds1.Tables["aaa"].Rows)                            {                                string sql = "这里用来插入到目标数据库";                                SqlCommand cmd = new SqlCommand(sql, connTarget);                                cmd.ExecuteNonQuery();                            }                            ts.Complete();//提交事务                            connSource.Close();                            connTarget.Close();                            return Json("同步完成!");                        }                    }                }            }            catch(Exception e)            {                return Json(e.Message);            }        }

问题:遇到了两个问题

1、xml路径问题

2、插入数据其实可以用insert into table from select * from table这个语句,但是还要判断目标数据库中是否已存在某条数据,而且业务中还需要些判断,可能会效率比较低,所以我就直接删除掉了,这样可能效率高一些


原创粉丝点击