由于多层应用系统经常是为了在缓慢的广域网络,或是服务大量的客户端用户,因此有效的节省网络的使用使用率便可以加快整个系统的执行效率。因此DELPHI的多层应用系统对于更新数据的设计理念便是先把更新的数据暂时储存在客户端应用程序之中,只有程序员真正决定把数据更新回后端的数据库时,必须再调用应用程序服务器提供的一个方法才会把更新的数据真正的更新回数据库之中。当程序员使用TclientDataSet组件的insert,edit,delete等方法更新数据,然后调用post之后。这些对于数据更新的结果并没有真正的更新回后端的数据库之中,而是暂时储存在客户端应用程序的内存之中。当用户在DBGRID中更新了任何的数据时,这些更新的数据暂时储存在客户端应用程序的内存之中,在执行TclientDataSet.applyupdates方法后才把这些暂时储存的数据真正的更新回后端数据库之中。TclientDataSet的changeCount属性中即包含了目前更新,但是尚未储存回后端数据库的数据笔数。TclientDataSet.applyUpdates方法接受一个参数,这个参数指明了用户在更新数据时允许发生多少次的更新错误。0表示不允许发生任何的更新数据错误。-1代表接受任何数目的更新错误。TclientDataSet.locate方法function locate(const keyfields: string; const keyvalues: variant; option: TlocateOptions): boolean; override;第一个参数代表要搜索的字段,第二个参数代表搜索的键值,第三个参数代表如何根据键值搜索数据。例如要搜索所有李维写的DELPHI书:cds.locate('author;booktype', varArrayOf(['李维','delphi']), [loCaseInsensitive, loPartialKey]);locate方法允许程序员使用数个字段来搜索数据,而且这些字段可以不是数据表索引字段。使用locate方法搜索数据时,TclientDataSet会先把数据表中所有的数据下载到客户端应用程序中再进行搜索动作。例如5万笔的记录,那么这个搜索的动作会把5万笔的记录下载到客户端应用程序中再搜索。这将花费许多的时间,也会造成网络严重的负荷。使用socketConnection:在应用服务器机器中必须执行scktSrvr.exe这个程序,否则你会得到“windows socket error”的错误消息。此外如果你是使用windows95做为客户端的话,那么你必须确定在客户端机器中安装了winSocket2.0之后的版本,否则也会得到winSocket的错误。TclientDataSet.packetRecord属性代表一次要从应用程序服务器得到多少数据。-1表示客户端应用程序一次会把所有的记录取到客户端。事实上这不是一个很好的设定,尤其是当数据很多时,这会浪费时间和内存,有时还会造成应用程序执行错误。所以程序员应该设定一个较小的数值。使用命令动态存取远程数据:1。TclientDataSet通过dcomConnection, socketConnection连接到应用程序服务器之中特定的datasetProvider来存取数据,而应用程序服务器中的datasetProvider又连接到一个dataset来存取数据,例如通过adoQuery使用SQL叙述来存取数据。非常的麻烦。2。通过TclientDataSet.commandText,允许程序员直接在客户端应用程序中使用SQL叙述动态的存取数据,或是对应用程序服务器下达特定的命令。减少了程序员的负荷,可以快速的在客户端应用程序中根据用户的行为来动态的存取数据。前提是必须设定datasetProvider.options属性中的poAllowCommandText属性为true,否则客户端应用程序将无法动态的下达SQL叙述。