您的位置:首页 > 数据库

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

2017-12-15 09:46 274 查看

需求:将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这个语句,但是还要判断目标数据库中是否已存在某条数据,而且业务中还需要些判断,可能会效率比较低,所以我就直接删除掉了,这样可能效率高一些


阅读更多
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐