我现在有两个数据库,一个是放在中心服务器,一个放在客户端,中心服务器的数据库不暴露在网络里,只能通过webservice访问.
两个数据库的数据经常会不同,所以客户端每次连中心服务器前,都要做一次数据库同步,把指定时间以后的数据下载到本地.我现在的做法是 客户端一连线,就调用webservice方法, 把中心服务器最新的数据生成一个 dataset 返回,然后 客户端再用一个dataset与之合并, 然后再调用 dataste 的update 方法,更新进本地数据库.我觉得这个效率会比较高一点但是发现两个dataset 合并后,用update 无法更新进数据库
我跟踪发现合并过来的 row  , rowstatue 是 unchanged ,是不是因为这个原因无法更新数据库?代码如下:
string myTempSql = "select * from tabdict where id = 'TEST001'";
string mySql = "select * from tabdict where id = '-1' ";
DataSet mTempSet = SelectDb(myTempSql, "tabdict", _TempConnString);
DataSet mDSet  = SelectDb(mySql, "tabdict", _connString);mDSet.Merge(mTempSet);this.da = new SqlDataAdapter(this._strSql, this.GetConn(sConString));this.sqlCmdBuilder = new SqlCommandBuilder(da);this.da.Update(mDSet, "tabdict");
mDSet.AcceptChanges();        public DataSet SelectDb(string strSql, string strTableName,string sConString)
        {
                this.da = new SqlDataAdapter(strSql, this.GetConn(sConString));                DataSet ds = new DataSet();                da.FillSchema(ds, SchemaType.Source, "tabdict");
                this.da.Fill(ds, strTableName);                return ds;
        }

解决方案 »

  1.   

    弄个SQL作业吧,晚上同步,你这样数据量大了 没办法了啊 ~~
      

  2.   

    我跟踪发现合并过来的 row , rowstatue 是 unchanged ,是不是因为这个原因无法更新数据库?--------------是这个原因,Adapter.Fill 根据不同的 rowstatue 来调用实际的 XXXCommand 。
    实际上会先执行 mDSet.GetChanges() (返回被修改的Row数组)因为通过客户端提交上来的 DataSet 已经都是 Unchanged 了,所以你只能逐条手动根据服务端DB判断状态了。
      

  3.   

    fangxinggood (JustACoder)兄
    那有没有简单办法呢?我目前从服务端获取的数据,肯定是客户端没有的,都是新的.
    我用 
                    DataRow NewRow = mDSet.Tables[0].NewRow() ;
                    NewRow =  mRow;
                    mDSet.Tables[0].Rows.Add(NewRow);
    也不行, 新增过来的还是 unchanged.这个状态又是只读的. 很纠结.fox123871 (婴儿肥) 这个数据库同步是客户端连上网,就要更新的.而且服务端不暴露在网络上,只能通过webservic 访问.
      

  4.   

    遍历 DataRow, 调用 DataRow.SetAdded() mDSe.Tables[0].AsEnumerable().ForEach(r => r.SetAdded());
      

  5.   

    谢谢 fangxinggood (JustACoder)兄 
    居然这里有个方法可以设定状态. 
    搞定了.