三层结构,用ADOConnection+ADOQuery+DataSetProvider+SocketConnection+ClientDataSet搭建。  if CDSMaster.Active then       //CDSMaster为ClientDataSet的实例
    CDSMaster.Active := False;
  CDSMaster.CommandText := 'select * from aaa order';
  CDSMaster.Execute;
  CDSMaster.Active := True;以上代码将SQL语句发送到服务器,并从服务器上获取数据。但现在有这么一个问题,如果现在我要对客户端的数据集用SQL语句操作(如:Delete,update, insert等),该如何处理?

解决方案 »

  1.   

    adoquery也只能把其数据集内已有的记录变化,解析为SQL语句,然后把SQL语句提交给数据库系统去执行以实现持久化,adoquery的作用只是解析,不是操作和执行。操作数据集,只能使用它提供的方法和属性进行,数据库集本身不能执行SQL语句。除非把结果集再存入本地数据库之后,你就可以用SQL语句操作这些数据了。
      

  2.   

    to ddqqyy(ddqqyy):
      也就是说把结果集ClientDataSet里的内容先保存到本地,然后再用SQL语句操作(插入、删除、更新)保存到本地的数据集,操作完后,把结果再返回数据集ClientDataSet,然后再把ClientDataSet里的变化数据提交给服务器。
      

  3.   

    to ddqqyy(ddqqyy):
      也就是说把结果集ClientDataSet里的内容先保存到本地,然后再用SQL语句操作(插入、删除、更新)保存到本地的数据集,操作完后,把结果再返回数据集ClientDataSet,然后再把ClientDataSet里的变化数据提交给服务器。大概是这样一个思路吧,感觉很麻烦的。我还没有遇到过你这样的需求,非要用SQL语句来操作数据集中的数据吗?
      

  4.   

    如果现在我要对客户端的数据集用SQL语句操作(如:Delete,update, insert等),该如何处理?
    ====================================================================================本地客户端操作用SQL没有意义,直接用ClientDataSet的相关函数操作不就得了
      

  5.   

    想不通楼主这么干有什么目的,如果只是想不提交修改的数据到服务器,那么显示的时候就不要用数据感知控件来显示。如果显示还是要用数据感知控件的话,可以试着修改ClientDataSet向服务器发送的数据封包,不过那样做还是要向服务器交互一次,不推荐了。
      

  6.   

    想不通楼主这么干有什么目的
    =
    任何东西存在即有价值,举个例:Treeview和数据库相结合时,当要改变一批结点的父结点时,是不是用SQL来得快?