[再散分]征求意见,两地数据库同步的问题 两地局域网,这边输入的工作单另一边能看到,可批量更新,初步打算用webserveice,先查询到要更新的数据,下载到客户端,再一条条插入,做过的兄弟帮给点意见,谢谢~~~ 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用web services比较好实现,我刚做过一个项目就有这部分要求.和老兄的方法一样.先在本地查到要更新的数据.再调用远程的Web Service操作远程的数据库 帖点代码or(int table = 0;table < syncArray.Count;table++) { operate = (Operation)syncArray[table]; string[] servers = GetServer(operate.Server); int server = 0; switch(operate.OP) { case "Add": sqlComm.CommandText="select * from "+operate.TableName.ToString()+" where UID='"+operate.UID.ToString()+"'"; drTable=sqlComm.ExecuteReader(); fieldCount = drTable.FieldCount; fieldName = new string[fieldCount]; fieldType = new string[fieldCount]; fieldObj = new object[fieldCount]; while(drTable.Read()) { lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————开始"); //service.WriteToTable(); try { for(int i = 0; i < drTable.FieldCount;i++) { fieldName[i] = drTable.GetName(i); fieldType[i] = drTable.GetFieldType(i).ToString(); fieldObj[i] = drTable[i]; } string rs=""; for(server = 0;server < servers.Length;server++) { service.Url = hash[servers[server]].ToString(); rs = service.WriteToTable(operate.TableName.ToString(),operate.UID,fieldName,fieldType,fieldObj);// } if(rs == "true") { UpdateRecord(operate.TableName,operate.UID); } lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————完成"); } catch { lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————未能完成"); } } drTable.Close(); break; case "Del": lstSync.Items.Add("获取删除"+operate.TableName.ToString()+"的记录操作————开始"); try { for(server = 0;server < servers.Length;server++) { service.Url = hash[servers[server]].ToString(); result = service.DelFromTable(operate.TableName.ToString(),operate.UID);// } } catch { } lstSync.Items.Add("获取删除"+operate.TableName.ToString()+"的记录操作————完成"); break; case "Modify": sqlComm.CommandText="select * from "+operate.TableName.ToString()+" where UID='"+operate.UID.ToString()+"'"; drTable=sqlComm.ExecuteReader(); fieldCount = drTable.FieldCount; fieldName = new string[fieldCount]; fieldType = new string[fieldCount]; fieldObj = new object[fieldCount]; while(drTable.Read()) { lstSync.Items.Add("获取修改"+operate.TableName.ToString()+"的记录操作————开始"); //service.WriteToTable(); try { for(int i = 0; i < drTable.FieldCount;i++) { fieldName[i] = drTable.GetName(i); fieldType[i] = drTable.GetFieldType(i).ToString(); fieldObj[i] = drTable[i]; } for(server = 0;server < servers.Length;server++) { service.Url = hash[servers[server]].ToString(); result = service.UpdateTable(operate.TableName.ToString(),operate.UID,fieldName,fieldType,fieldObj);// //MessageBox.Show(result1); lstSync.Items.Add("获取更新"+operate.TableName.ToString()+"的记录操作————完成"); } } catch(Exception ex) { //MessageBox.Show(ex.Message); lstSync.Items.Add("获取修改"+operate.TableName.ToString()+"的记录操作————未能完成"); } } drTable.Close(); break; } } sqlComm.CommandText="delete from Operation"; try { sqlComm.ExecuteNonQuery(); } catch { } sqlConn.Close(); lstSync.Items.Add("数据异步更新————完成"); } 忘了说,不用webForm,用winForm,公司内部知道就行。相对来说,这个应该简单一些。另外一定要保证安全,事关生产,至少要保证数据库服务器的安全。 你的系统客户端交互式设计是什么机制?数据刷新的性能要求如何?=====================================winForm服务端是否一直在线?=====================================如果安全的话,可以一直在线你是否详细研究过两边数据库都有哪些冲突的可能性?=====================================数据库结构一样,不能有重复记录,这个简单,另个要同步的不是整个数据库,而是4、5个表。我是这样想的,A端要更新时,发出请求,也就是调用B端的webService,返回要更新的数据,然后逐条插入到A那边的数据库中。上面有的兄弟可能想得太复杂了。 lovvver(www.notsoft.cn) 兄还是没弄明白我的问题。为什么不弄一台数据库服务器,放在公网上共用呢?================================================不是做网站,是公司内部用的,本来要用光纤,但考虑到成本,就用adsl包月要实际一些用前台程序来同步两地的数据库,这是非常不明智的做法。================================================先查询,查询到的无误再更新,再强调一下,是winForm。 请问如何设置使得新窗口右上角关闭按钮不可用 邮件发送问题 连续打印,如何设置不同标题? 导出为EXCEL表后页面就关闭了? 初用EA ,觉得EA6.5好巴适哦。 .Net的Bug??? 在TextBox中按回车却响应按钮单事件? 一个多线程,SOCKET连接与发送数据的例子。 c#自定义安装中如何获取安装文件的目录或路径 ~~~~~~~~DataTable自增长列,很奇怪的问题!~~~~~~~~ 求助 关于C#多线程调用c++dll 写个程序,需要调用DOS应用程序,怎么办?? 请各位指点,有点迷惑(100分求助)
我刚做过一个项目就有这部分要求.
和老兄的方法一样.先在本地查到要更新的数据.
再调用远程的Web Service操作远程的数据库
帖点代码or(int table = 0;table < syncArray.Count;table++)
{
operate = (Operation)syncArray[table];
string[] servers = GetServer(operate.Server);
int server = 0;
switch(operate.OP)
{
case "Add":
sqlComm.CommandText="select * from "+operate.TableName.ToString()+" where UID='"+operate.UID.ToString()+"'";
drTable=sqlComm.ExecuteReader(); fieldCount = drTable.FieldCount;
fieldName = new string[fieldCount];
fieldType = new string[fieldCount];
fieldObj = new object[fieldCount];
while(drTable.Read())
{
lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————开始");
//service.WriteToTable(); try
{
for(int i = 0; i < drTable.FieldCount;i++)
{
fieldName[i] = drTable.GetName(i);
fieldType[i] = drTable.GetFieldType(i).ToString();
fieldObj[i] = drTable[i];
}
string rs="";
for(server = 0;server < servers.Length;server++)
{
service.Url = hash[servers[server]].ToString();
rs = service.WriteToTable(operate.TableName.ToString(),operate.UID,fieldName,fieldType,fieldObj);//
}
if(rs == "true")
{
UpdateRecord(operate.TableName,operate.UID);
}
lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————完成");
}
catch
{
lstSync.Items.Add("获取添加到"+operate.TableName.ToString()+"的记录操作————未能完成");
}
}
drTable.Close();
break;
case "Del":
lstSync.Items.Add("获取删除"+operate.TableName.ToString()+"的记录操作————开始");
try
{
for(server = 0;server < servers.Length;server++)
{
service.Url = hash[servers[server]].ToString();
result = service.DelFromTable(operate.TableName.ToString(),operate.UID);//
}
}
catch
{
}
lstSync.Items.Add("获取删除"+operate.TableName.ToString()+"的记录操作————完成");
break;
case "Modify":
sqlComm.CommandText="select * from "+operate.TableName.ToString()+" where UID='"+operate.UID.ToString()+"'";
drTable=sqlComm.ExecuteReader(); fieldCount = drTable.FieldCount;
fieldName = new string[fieldCount];
fieldType = new string[fieldCount];
fieldObj = new object[fieldCount];
while(drTable.Read())
{
lstSync.Items.Add("获取修改"+operate.TableName.ToString()+"的记录操作————开始");
//service.WriteToTable();
try
{
for(int i = 0; i < drTable.FieldCount;i++)
{
fieldName[i] = drTable.GetName(i);
fieldType[i] = drTable.GetFieldType(i).ToString();
fieldObj[i] = drTable[i];
} for(server = 0;server < servers.Length;server++)
{
service.Url = hash[servers[server]].ToString();
result = service.UpdateTable(operate.TableName.ToString(),operate.UID,fieldName,fieldType,fieldObj);//
//MessageBox.Show(result1);
lstSync.Items.Add("获取更新"+operate.TableName.ToString()+"的记录操作————完成");
}
}
catch(Exception ex)
{
//MessageBox.Show(ex.Message);
lstSync.Items.Add("获取修改"+operate.TableName.ToString()+"的记录操作————未能完成");
}
}
drTable.Close();
break;
}
}
sqlComm.CommandText="delete from Operation";
try
{
sqlComm.ExecuteNonQuery();
}
catch
{ }
sqlConn.Close();
lstSync.Items.Add("数据异步更新————完成"); }
相对来说,这个应该简单一些。另外一定要保证安全,事关生产,
至少要保证数据库服务器的安全。
=====================================
winForm服务端是否一直在线?
=====================================
如果安全的话,可以一直在线你是否详细研究过两边数据库都有哪些冲突的可能性?
=====================================
数据库结构一样,不能有重复记录,这个简单,
另个要同步的不是整个数据库,而是4、5个表。我是这样想的,A端要更新时,发出请求,也就是调用B端的webService,
返回要更新的数据,然后逐条插入到A那边的数据库中。上面有的兄弟可能想得太复杂了。
================================================
不是做网站,是公司内部用的,本来要用光纤,
但考虑到成本,就用adsl包月要实际一些用前台程序来同步两地的数据库,这是非常不明智的做法。
================================================
先查询,查询到的无误再更新,再强调一下,是winForm。