现在正在做一个三层结构的MIS系统!
在数据更新方面使用的方案是服务器端通过一个Provider来完成客户端所有数据的更新!
客户端只需要传递Delta和数据集的ID到服务器端!
服务器端将从数据字典中搜索出数据集ID的相关字段及其属性!
并根据字段的属性值来完成数据的更新!现在数据的解析部分已经完成!
但有一个问题比较难解决!
就是客户端怎么把数据集的ID传递到服务器端!
如果用ClientDataSet.DataRquest来实现的话!
数据处理的过程中可能会出现问题!
如客户端一次性传递了一个数据集ID及一千条更改的数据到服务器端!
服务器端需要一条一条的去解析并将其转化为SQL语句!
如果服务器端还未更新完这一千条数据,客户端又进行了一次数据更新(由于客户端采用MDI模式,这种情况有可能发生)
此时传递过到服务器端的数据集ID将覆盖原有的数据集ID!
服务器在更新第一次传递的数据时就会出错(因其原来更新的数据集ID已经被覆盖,服务器端不能正确解析数据集)!求上述问题的解决方案!我想最好能够把数据集的ID包含到Data或Delta中去!这样服务器端在进行数据更新时,需要更新的数据及其数据集ID都是从Delta中读取,就不会产生上述问题!在网上看了一遍相关文章,但不能实现!在此想听听各位富翁的意见及建立!
最好是能找出一种完美的解决方案!

解决方案 »

  1.   

    晕,兄弟怎么这么处理,太麻烦了!
    我在的公司就是搞三层开发的,数据库连接是ADO,通讯技术是Corba。
    数据更新基本流程是:在TADODataSet的commandtext属性里写SQL语句,这样可以在数据集里自动添加SQL里的字段信息,然后通过TDataSetProvider把该数据集提供给客户端的TClientDataSet,然后启动服务器,设置好客户端与服务器的连接,这样客户端的TClientDataSet可以从服务器端的字段信息读出来,在客户端对TClientDataSet字段内容的所有修改都可以通过TClientDataSet的ApplyUpdates()提交到服务器端。
      

  2.   

    --如客户端一次性传递了一个数据集ID及一千条更改的数据到服务器端!--
    可以采用登记的形式,不是对每一个id都作一次相应的更新,而是提交到服务器端后,一次性的更新
    银行的系统就是采用这种方式。
      

  3.   

    同意force2004(牛牛)的做法,只是我用的是ADO+Socket
      

  4.   

    同意 whythinkwhy(小生) 的说法,ID的生成应在服务器端,而不是客户端
      

  5.   

    晕,兄弟怎么这么处理,太麻烦了!
    我在的公司就是搞三层开发的,数据库连接是ADO,通讯技术是Corba。
    数据更新基本流程是:在TADODataSet的commandtext属性里写SQL语句,这样可以在数据集里自动添加SQL里的字段信息,然后通过TDataSetProvider把该数据集提供给客户端的TClientDataSet,然后启动服务器,设置好客户端与服务器的连接,这样客户端的TClientDataSet可以从服务器端的字段信息读出来,在客户端对TClientDataSet字段内容的所有修改都可以通过TClientDataSet的ApplyUpdates()提交到服务器端。
    --------------------------同意force2004(牛牛)的处理办法。你所说的“如果服务器端还未更新完这一千条数据,客户端又进行了一次数据更新(由于客户端采用MDI模式,这种情况有可能发生)”,这种情况服务器会自己处理数据冲突的,当你设置了adodataset的locktype属性,也就是adodataset的锁定方式!
      

  6.   

    我用的DBExpress控件!服务器端通过一个Provider来完成客户端所有数据的更新!所以没办法在服务器端来生成数据集的ID!举个例子吧:
    客户端ClientDataSet1的ID为100(该ClientDataSet1显示的数据通过Inner join 或 Left join 来自于多个数据表),连接到服务器端的Update_Provider;
    在客户提交ClientDataSet1所更新的数据到服务器端时
    服务器端根据客户端传递过来的数据集ID(此时为100)到数据字典里面去搜索字段信息,并将相应字段值更新到该字段所属的数据表中;当ClientDataSet2也是连接到服务器端的Update_Provider,但他的ID为1001
    对ClientDataSet2的更新也是按ClientDataSet1的方式!传递数据集ID的作用只是为了服务器在更新数据的时候,能够在数据字典中准确的找到更新的数据集中每一个字段所属的数据表,并能将数据准确的进行更新!所以我想把客户端数据集的ID嵌入到delta中!
      

  7.   

    我记得clientDataset有个data属性啊;你把data传给appserver就是了;这个data会保持dataset的状态,一样的访问和使用;server的function中更新database数据就靠它;并且client&server之间不需要时刻维持通讯的。
      

  8.   

    另外,我以前还采取了一种特别的作法;因为clientdataset和database是断开模式的,也就是内存记录;所以我会给client的grid数据源增加一个状态字段;post 数据的时候会告诉appserver哪些是需要修改的或增加的;另外,控制好单据编号之后我的修改数据全部都是先删除,再重新插入到表;也就是说,数据库操作不存在update控制,只有insert