使用TclientDataset

来源:互联网 发布:最新淘宝删除中差评 编辑:程序博客网 时间:2024/05/10 09:09
由于多层应用系统经常是为了在缓慢的广域网络,或是服务大量的客户端用户,因此有效的节省网络的使用使用率便可以加快整个系统的执行效率。
因此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叙述。  在多层应用系统中,当客户端应用程序连接到应用程序服务器而且开始使用TclientDataset组件以分段的在多层应用系统中,当客户端应用程序连接到应用程序服务器而且开始使用TclientDataset组件以分段的方式向应用程序服务器取得数据时,应用程序服务器中TdatasetProvider的onGetData事件处理函数便会被触发。在onGetData中,程序员可以对即将传递到客户端的数据进行任何的先期工作。例如加密数据,或是再附加一些额外的信息到客户端应用程序中。此外这个事件处理函数中应用程序服务器也可以执行一些登录的工作,以记录客户端应用程序向应用程序服务器取得了那些信息。除了可以由客户端应用程序自动向应用程序服务器取得数据之外,客户端应用程序也可以使用程序代码从应用程序服务器取得数据。使用程序代码取得数据的好处是程序可以更精确的取得客户端应用程序需要的数据,以及在什么时候取得数据。使用TclientDataset的dataRequest方法客户端应用程序可以调用dataRequest方法取得任何备件的数据。dataRequest方法接受一个oleVariant参数。当客户端应用程序调用TclientDataset的dataRequest方法之后,应用程序服务器中TdatasetProvider的onDataRequest事件处理函数便会被触发,同时onDataRequest事件处理函数会收到客户端传递来的参数。onDataRequest事件处理函数就可以根据这个参数向数据库服务器取得数据,再传递回客户端。cds.data := cds.provider.dataRequest('select * from test');当上述代码执行后,应用程序服务器的onDataRequest事件处理函数会被触发。此时应用程序服务器就可以根据这个SQL叙述取得数据并且传递回客户端。下面的代码便是应用程序服务器中onDataRequest如何根据客户端应用程序传递来的SQL叙述向数据库取得数据再回传到客户端应用程序之中。function Txxx.datasetProviderDataRequest(sender: Tobject;  input: oleVariant): olevariant;var  i: integer;begin  query.close;  query.sql.clear;  query.sql.text := input;  query.open;  datasetProvider.reset(true);  result := datasetProvider.getRecords(10, i);end;dataRequest取得数据的方法不限于使用SQL叙述,程序员可以通过参数以任何的方式从应用程序服务器取得数据。在DELPHI5中由于TclientDataset已经加入了commandText属性,所以使用dataRequest来下达SQL叙述已经过时了,不过dataRequest在许多的场合中仍然非常的有用。dataRequest方法并不局限于SQL叙述,程序员可以使用dataRequest传递一些命令到应用程序服务器,再让应用程序服务器根据这个命令来存取数据,例如客户端应用程序可以下达一些稿本命令到应用程序服务器,再让应用程序服务器剖析并且执行这个稿本命令。人工存取数据1。程序员想要自行控制存取数据,首先需要设定TclientDataset的fetchOnDemand属性值为false。然后当程序员需要存取下一分段的数据时,只需要调用TclientDataset的getNextPacket方法就可以取得下一分段的数据。当TclientDataset调用getNextPacket取得新的数据之后,就会把这些新取得的数据加入到TclientDataset维护的数据之中。2。程序员也可以调用Iappserver接口的getRecords方法取得指定笔数的数据,再调用TclientDataset的appendData方法把取得的数据加入到TclientDataset的快储数据区之。下面是代码:vdata := cds.appserver.getrecords(10, i);cds.appenddata(vdata, false); 
http://www.winu.cn/space-14160-do-blog-id-2165.html
原创粉丝点击