本人数据库新手,改造了一下 delphi7 自带的 pooler demo 做中间层,然后自己做了一个 client.结构是这样:
中间层: pooler + rdm + sqlconnection + sqlquery + datasetprovider1client:dm + clientdataset + datasource + dbgrid ...
可是现在发现一个问题,假如我的一个client 连接中间层,使用 datasetprovider1 连接了一个表 A 。同时,另一个client也使用 datasetprovider1 连接了表 B。这个时候,第一个 client 进行更新 applyupdate 就会出错:field name not found。我知道这个可能是因为 datasetprovider1 被第二个 client 占用了。但是,不是说 pooler 机制会自动管理这种问题吗?怎么会出现这种情况?郁闷呀!!!难道我要全部改成两层?高手知道怎么做吗?指点一下我呀。救命的呀!很多表要连接,难道我每一个表建一对 sql query + datasetproviderX ?那 pooler 有什么用?救命呀,谢谢!

解决方案 »

  1.   

    我也想知道pooler该怎么用,先顶顶楼主
      

  2.   

    关注中,建议查下李维的Delphi 5.X分布式多层应用系统开发
    www.netyi.net有得下载电子图书
      

  3.   

    你要对一个表的更新需要,使用provider取得数据,然后操作,然后就更新,中间不能将provider用于其他数据表,你的理解是对的,
    但是既然是个demo,当然就只提供这些功能,
    如果你想扩展,也就是说同时持有多个数据集的话,就要自己设计机制,
    简单说,现在的provider其实是有状态的,所以不能更新成功,因此,你可以在需要更新的时候,让provider重新用你的cds的sql来打开一下
      

  4.   

    to JavaD(一竿残照(生如夏花之绚烂,死若秋叶之静美)) ,可是用 provider 重新打开以后,第二个表也就不能够 applyupdate 了,又被第一个占用了呀。而且你说的 cds 的 sql 打开是指什么?是不是指 cds.open ? 这样之前改掉的数据会被清空了呀!指导一下怎么解决啊?感谢!
      

  5.   

    试试看:  在ClientDataSet.BeforeApplyUpdates中传入SQL语句
      在Provider.BeforeApplyUpdates中将得到的SQL语句赋值给 SQLQuery.SQL.Text
    程序如下:
    Client端:
      procedure xxxx.ClientDataSetBeforeApplyUpdates(Sender: TObject; var OwnerData: OleVariant);
      begin
        with (Sender as TClientDataSet) do
          OwnerData := CommandText;
      end;Server端:
      procedure xxxx.ProviderBeforeApplyUpdates(Sender: TObject;
        var OwnerData: OleVariant);
      begin
        SQLQuery.SQL.Text := OwnerData;
      end;实际上是告诉 SQLquery 此时需要更新的表。(一般用 select 语句)这样就可以更新了。只是不知道执行效率和数据安全性如何。试一试吧?
      

  6.   

    搞定了,多谢 hoho5999,真的非常感谢。分不多,请接分!