怪事,我的clientdataset的参数为什么不能传到应用服务器上的Query(50分)

  • 主题发起人 主题发起人 zttiger
  • 开始时间 开始时间
Z

zttiger

Unregistered / Unconfirmed
GUEST, unregistred user!
请教大虾们,很简单的一个问题,但我楞是出不来.
Corba三层结构,应用范围器端的query的SQL属性为'select * from table1 where
man1=:PID_0 or man2=:PID_1'
为什么我在客户端给相应的clientdataset的参数赋值后却不能传递到服务器端
是否DCOM和CORBA的设置有什么区别(一般书中都是以DCOM为例),
我的CORBA服务器应该没有设置错呀,我能完成其它的三层操作呀
求救!!!!!!!!!!!!![:(][:(][:(]
 
你在corba服务器上创建一个方法,有三个参数,其中两个为 输入类型的字符串,实际运行的时候
对应这两个参数,第三的参数为可以回传的variant*类型,用来回传查询到的数据即可!
 
客户端参数是在什么事件中传出的?
我试过,在OnBeforGetResorcset事件中传出的参数没有问题,服务器端也在相同的事件
中接收。
如果你是直接使用clientdataset的参数对象来给参数赋值的,我就不太清楚了,没试过。
 
这个方法是你自己通过调用接口来激发的,它不是通过事件进行激发。
 
你的corba服务器能接受事件激发?那你的corba服务器是怎样创建的?不是用corba object
或corba datamodule创建的?不是现在delphi所融合的visibroker技术不支持事件服务吗?
 
是按照李维的《Delphi 5.X分布式多层应用系统篇》第二章来做的,除了我的服务器是
corba,他是DCOM外.
我的确是在clientdataset里设置参数的,好象这样的设置比较简便,步骤少.
我的PID_0,PID_1的属性设置:Datatype:ftstring
paramtype:ptunknown
value:空白
Type:string
我的参数赋值方法:
qu11.close;
//qu11是clientdatast的name
qu11.params.parambyname('PID_0').AsString:='aaa';
qu11.params.parambyname('PID_1').AsString:='aaa';
qu11.open;
但是在服务器端的相应query的Beforeopen和afteropen事件里都捕捉不到正确的参数值
难道corba中用clientdataset参数赋值不可行吗
 
blueeagle,我是用corba datamodule做的.可能我说的有点偏差,我所说的事件激发,是指
在服务器上接口上做的方法能被客户端正确调用.
 
会不会是我的参数的类型设置有问题呀
 
毛病我找到了,确实是参数类型设置上的问题,我按照delphi自带例子:
/Borland/Delphi5/Demos/Midas/Setparam
来设置我的corba服务器和客户端,结果传递成功
现在请教如何设置我的参数类型。
我的数据库是oracle,man1、man2字段的类型是varchar2(10)
那么我的参数PID_0,PID_1的 类型属性怎么设置呢?
多谢
 
发现新问题,上边的例子中把SQL 语句中的‘>=’换成‘=’,则又不能返回记录了
真是把我搞糊涂了
 
呵呵,问题越来越多。刚才以为传递记录成功,其实传过来的记录有误,不属于范围的
记录也被传递回来了 ,我都要疯了。
 
搞了半天,原来是参数的缺省值在起作用,把缺省值去掉,还是不能传递参数
今天晚上算是白忙了
 
zttiger :你为什么要自己设置参数类型?不是直接修改query 控件的SQL属性,它自己就能识别
参数吗?(这个你可以在修改query 控的parameters属性查看到!) ,而且参数赋值的时候
直接在corba 服务器上的方法中写代码:
qry.close;
//qry是query(adoquery)的name
qry.params.parambyname('PID_0').value:='aaa';
qry.params.parambyname('PID_1').value:='aaa';
qry.open;
 
blueeagle,我是如你所说的那样直接修改query 控件的SQL属性的,
不过值‘aaa’是在客户端生成,我的目的是想把值‘aaa’从客户端传到应用服务器上,
所以应该不是在CORBA服务器上写这代码吧
 
zttiger:
我是在corba服务器上写这个代码的!只要将你类似于'aaaa'之类的参数值传到corba
方法上,然后corba服务器不就可以将query中的records返回给客户端吗?
我的实现方法如下:
1 :你在corba服务器上创建一个方法,有三个参数,其中两个为 输入类型的字符串(bstr,in),实际运行的时候
对应这两个参数,第三的参数为可以回传的variant*(in,out)类型,用来回传查询到的数据即可!
2:在corba datamodule 中放入adoconnection,adoquery ,datasetprovider ,tclientdataset
使clientdataset连接到datasetprovider 而datasetprovider连接到adoquery,adoquery连接到
adoconnection
3:corba方法的代码:
qry.close;
//qry是query(adoquery)的name
qry.parameters.parambyname('PID_0').value:='aaa';
qry.parameters.parambyname('PID_1').value:='aaa';
qry.open;
clientdataset1.close;
clientdataset1.open;(让clientdataset取得新的查询数据!)
qrydata:=clientdataset1.data;(qrydata为corba方法中的olevariant*参数);
4:客户端代码:
var coobject:imyinterface;(你定义的corba接口)
askdata:olevariant;
coobject:=tmycorbacorbafactory.createinstance('');//创建实例
coobject.getdata('aaa1','aaa2',askdata);//调用服务器方法,注意参数
clientdataset1.data:=askdata;(从服务器端获得的数据送给clientdataset用户显示)
5:
你试试吧,我经常用这个方法,祝你成功!



 
多人接受答案了。
 
后退
顶部