最近在做一个数据库同步的项目,数据库都是sql,编程语言是c#。
如果是两个实体服务器之间的数据库同步,利用sql的发布订阅就可实现。但是现在这个是要同步服务器和微软azure上的数据库,发布订阅是不行了,只有手动编写数据库同步程序。
而且,我们的数据库比较复杂,各个表之间都有关联,而且ID都是自动增长类型的。查阅了很多资料,都不可行,最后终于找到了一篇文献资料,然后完美的解决了我的问题。
1)、首先,不要循环把每条数据更新到数据库。这种方法不很现实,哪怕数据量非常小,而且还要保证网络连接非常的好。即使满足这些,长时间运行还是会出现连接的timeout超时,等等...
2)、所以,最好用批量导入更新数据的方法,就是SqlDataAdapter。如果单纯的是导入数据,也可以用bulk了,网上代码很多,但是如果有导入和更新那就最好用SqlDataAdapter了。
下面上代码,
1、首先把查询的数据库记录保存下来,查询语句类似于以下语句:
SqlConnection conn = new SqlConnection(ConnectionString);//ConnectionString是数据库连接语句字符串,包含服务器名,数据库名,用户名,密码等
string Querystr=“select * from 表名”;//查询语句字符串。
(复杂一点的语句,灵活运用sql查询语句,现在sql运行一下,没问题就放心写入c#里面。
Querystr = "select * from 表A join 表B on 表A.EfficiencyID=表B.EfficiencyID where left(表A.ShiftCode,8)>CONVERT(varchar(100), GETDATE()-" + day + ", 112)";)
SqlDataAdapter da=new SqlDataAdapter(Querystr, conn);
DataSet ds=new DataSet();
da.Fill(ds);//填充数据集
ids.Add(str, ds);
2、获得了查询结果,程序里怎么摆布都行,我的是从ds里面辨别出哪条语句是插入的insert,哪条语句是更新的update。
插入代码如下:
DataSet dss = new DataSet();
adapter = new SqlDataAdapter(cmd);
commandBulider = new SqlCommandBuilder(adapter);
commandBulider.ConflictOption = ConflictOption.OverwriteChanges;
adapter.SelectCommand = new SqlCommand("select ShiftCode,StartTime,EndTime,StartPlanDownTime,EndPlanDownTime,Overtime,IsClosed from Shift", conn);
adapter.InsertCommand = new SqlCommand("insert into Shift (ShiftCode,StartTime,EndTime,StartPlanDownTime,EndPlanDownTime,Overtime,IsClosed) values (RTRIM(@ShiftCode),@StartTime,@EndTime,@StartPlanDownTime,@EndPlanDownTime,@Overtime,@IsClosed)", conn);
adapter.InsertCommand.Parameters.Add("@ShiftCode", SqlDbType.Char, 10, "ShiftCode");
adapter.InsertCommand.Parameters.Add("@StartTime", SqlDbType.DateTime, 8, "StartTime");

最低0.47元/天 解锁文章


被折叠的 条评论
为什么被折叠?



