Delphi真的走下坡路了,没人能回答这些问题了----没人能帮我了吗 ( 积分: 100 )

  • 主题发起人 主题发起人 chinazxy2008
  • 开始时间 开始时间
返回名字就可以了,我做的三层结构就是这样的,肯定没有问题的。<br>创建后在远程数据对象中注册,不用的时候在反注册<br>每一个客户端发来的请求连接都会创建一个私有的远程数据对象,你的数据集创建在哪里都无所谓,(我自己用的是创建在了另一个单元中,主要是为了几个客户端共享使用),但注册的时候一定要在(好像也只能在,我也没看具体帮助[8D])远程数据对象中注册
 
我估计问题是:<br>你采用了SOAP结构,我跟踪发现每次Cds请求完数据,服务器的DataModule马上释放(HTTP无状态),也就是你创建的TDataSetProvider根本不能给下一次请求找到,你这样动态创建的方法不可行。
 
还有一个问题,我在设计阶段,一旦我连上服务器后,只要不断开,客户端介面上的TclientDataset可以选择DataModal上的所有Provider。也就是说对象的存在跟连接有关,跟取数据没有关系
 
还有的人呢
 
服务器端会对每一个连接建立一个远程数据模块的实例,如果你的连接断开了,那么该实例也就由于引用为零而自动释放。<br>SOAP用的是短连接,每次数据请求结束后都会自动断开连接,估计这个就是你的程序为什么找不到对应名称的Provide的原因了。
 
关键我在设计阶段连接后,只要不断开连接,无论取数据和关闭数据,只不要断开连接,随时可以看到服务端的所有Provider,说明远程数据模板与连接有关而与取数据无关,
 
你自己有没有去分析设计阶段取Provider的代码?看到所有Provider,难道不能是先取得后,缓存的吗?每次重新连接你未必“感觉”到吧?你可以利用OutputDebugString在你的TSoapDataModule的OnCreate和OnDestroy时间里面看看就知道了。
 
JamesBond_L:你说的是真的,我测试过了,在取数据时就连接,取完后就关闭,也就是在调用创建对象的方法中还没有关闭连接,在方法创建完后连接关闭,此时再去连接创建的对象理所当然是失败,但请问怎么解决动态创建对象的方法。还是行不通
 
你又何必要动态?有这个必要非要这样处理吗?
 
是这样的,如果能解决在动态创建的话,我就不用在DataModal中放很多Query和Provider了,系统大了就是个问题,有时要做几个DataModal
 
你动态创建和把ClientDataSet连到同一个Provider,然后传递不同的参数取值好像效果一样吧?
 
更新数据也一样吗
 
差不多,不过你要代码处理一下,可以处理ClientDataSet的Data或者Delta属性的内容,具体你自己搜索论坛看看吧
 
我觉得这问题不难<br>自己调试一下,可以解决的
 
接受答案了.
 
我看到比较晚,我这段代码不知能不能帮你<br>Function&nbsp;d_sys_sel(sqlc:TADOConnection;sql:String;var&nbsp;ds:String):Integer;<br>var<br>&nbsp;&nbsp;Query:TADOQuery;<br>&nbsp;&nbsp;DataSetProvider:TDataSetProvider;<br>begin<br>&nbsp;&nbsp;result&nbsp;:=&nbsp;-1;<br>&nbsp;&nbsp;try<br>&nbsp;&nbsp;&nbsp;&nbsp;Query&nbsp;:=&nbsp;TADOQuery.Create(nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;Query.Connection&nbsp;:=&nbsp;sqlc;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;DataSetProvider&nbsp;:=&nbsp;TDataSetProvider.Create(nil);<br>&nbsp;&nbsp;&nbsp;&nbsp;DataSetProvider.DataSet&nbsp;:=&nbsp;Query;<br>&nbsp;&nbsp;&nbsp;&nbsp;DataSetProvider.Options&nbsp;:=&nbsp;[poAllowCommandText];<br>&nbsp;&nbsp;&nbsp;&nbsp;DataSetProvider.UpdateMode&nbsp;:=&nbsp;upWhereAll;<br><br>&nbsp;&nbsp;&nbsp;&nbsp;Query.Close;<br>&nbsp;&nbsp;&nbsp;&nbsp;Query.Sql.Add(sql);<br>&nbsp;&nbsp;&nbsp;&nbsp;Query.Open;<br>&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;not&nbsp;Query.Fields[0].IsNull&nbsp;then<br>&nbsp;&nbsp;&nbsp;&nbsp;begin<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;ds&nbsp;:=&nbsp;VarArrayToString(DataSetProvider.Data);<br>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;result&nbsp;:=&nbsp;0;<br>&nbsp;&nbsp;&nbsp;&nbsp;End<br>&nbsp;&nbsp;finally<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(Query);<br>&nbsp;&nbsp;&nbsp;&nbsp;FreeAndNil(DataSetProvider);<br>&nbsp;&nbsp;end;<br>end;<br>其中因为三层传输变量类型的限制,我把检索出的数据通过VarArrayToString转成String了,在客户端再用StringToVariant转回来,赋给ClientDataSet.Data,这两个函数能从网上找到
 

Similar threads

后退
顶部