紧急求救!!三层应用中的一个问题?? (100分)

  • 主题发起人 主题发起人 kmyan
  • 开始时间 开始时间
K

kmyan

Unregistered / Unconfirmed
GUEST, unregistred user!
1.curvalue的值怎么才能读出来?还有什么更好的方法读书当前数据库值?
2。在三层结构中运用存储过程老出错,错误如下:
我在SQL Server中有一个存储过程,需要传入一个参数,中间层中用了
ADOStoredProc和DataSetProvider,客户端使用Socketconnection,ClientDataSet。
ClientDataSet通过中间层的DataSetProvider对应ADOStoredProc。
请问:在Open或Execute ClientDataSet时,如何向存储过程传递参数?
有方法如下: (并且appserver后面的这个函数不会自动提示出来,是
不是需要再调用什么函数)
datamodule2.socketconnection1.appserver.setactive(edit1.text);
这是什么意思?而且还有错。
错误信息为“method 'setactive' not supported automation object”。
 
错误的原因是因为自动化COM对象不支持你的这种数据类型:TEXT类型是不能自动化的数据类型,用OLEVARIANT试试。
客户端需要参数,你调用FETCHPARAMS这个方法就能从中间层取得参数列表,
然后用CLIENTDATASET1.PARMS.PARAMBYNAME('PARAMS').VALUE:=YOUR_VALUE;就行了.
 
to nsj
你说的这种方法是在客户端写参数,我现在是在应用层写参数,不把参数传到客户端
但在调用是老出现这种错误,为什么?
 
不好意思,帮不上你了
 
1、对于通过中间层的方法调用存储过程,请注意以下细节:
请检查中间层是否已重新注册,method 'setactive' not supported automation object是
指该方法在应用服务器中找不到或参数传递不正确。在中间层设置的参数数据类型应为BSTR
2、我个人认为一般情况下调用存储过程还是用clientdataset更好一些。调用方法就如nsj所说的

 
存储过程:
CREATE procedure usp_xyx_select_update_where
(@sale_date datetime,@sale_man char(20),@sale_to char(20),
@sale_ticket_number int,@sale_ticket_number_hs int output,
@errcode smallint output)
as
select @ErrCode=0
select @sale_ticket_number_hs=0
select @sale_ticket_number_hs=ticket_num from eg_sale_hs_number where sale_to =@sale_to
if (@sale_ticket_number_hs- @sale_ticket_number<0)
begin
select @ErrCode=1
return @ErrCode
end
else
begin
update eg_sale_hs_number set ticket_num=@sale_ticket_number_hs- @sale_ticket_number
where sale_to =@sale_to
insert into eg_sale_plane(sale_date,sale_man,sale_to,sale_ticket_number)
values(@sale_date,@sale_man,@sale_to,@sale_ticket_number)
select * from eg_sale_plane
select @sale_ticket_number_hs=@sale_ticket_number_hs- @sale_ticket_number
select @ErrCode=0
return @ErrCode
end
应用服务器端:
function ttest_updates.update_st(sale_date:tdatetime;sale_man:string;sale_to:string;sale_ticket_number:integer):smallint;
begin
storedproc1.Close;
storedproc1.ParamByName('@sale_date').asdate:=sale_date;
storedproc1.ParamByName('@sale_man').asstring:=sale_man;
storedproc1.ParamByName('@sale_to').asstring:=sale_to;
storedproc1.ParamByName('@sale_ticket_number').asinteger:=sale_ticket_number;
storedproc1.ExecProc;
result:=storedProc1.ParamByName('@errcode').value;
end;
客户端:
procedure TForm2.BitBtn1Click(Sender: TObject);
var
errcode:smallint;
sale_date:tdatetime;
sale_man,sale_to:string;
sale_ticket_number:integer;
v:variant;
begin
if strtoint(edit4.text)>strtoint(dbedit1.Text) then
begin
application.MessageBox('对不起,机票已没有这么多了','提示',0);
exit;
end;

button1.Enabled :=true;
button2.Enabled :=true;
bitbtn1.Enabled :=false;
bitbtn2.Enabled :=false;
v:=dcomconnection1.GetServer;
sale_date:=strtodate(edit1.text);
sale_man:=edit2.text ;
sale_to:=combobox1.text ;
sale_ticket_number:=strtoint(edit4.text);
v:=dcomconnection1.AppServer.update_st(sale_date,sale_man,sale_to,sale_ticket_number);
 
>>错误信息为“method 'setactive' not supported automation object”。
哈哈,我以前也是遇到了这种情况,是你没有在中间层建立这个'setactive' method .

>>datamodule2.socketconnection1.appserver.setactive(edit1.text);
>>这是什么意思?
这句语名的意思是向中间层函数传送edit1.text值.

快点给分!
这个问题怎么和我以前问得一样?
http://www.delphibbs.com/delphibbs/dispq.asp?lid=524002

 
to dark_eagle
我就是把你的贴了过来……呵呵
你看到我上面写的代码了吗,怎么可能没有那个方法,我都定义了的
你看我的代码有问题吗?问题在哪?
 
哦,应该也是看了delphi5.0实务经典里的第16章的例子!
 
中间层方法中的字符参数类型应为WideString
 
to:dark_eagle
我没有看你所说的那本书,我是看李维的那三本书,不管看什么,那个方法怎么老不行?
to :llh_lily
string和widestring有什么区别?
 
应该是用type libary 建立一个方法(method), 名字应该为setactive.我可看到你没有建立呀!
我的QQ是12112674.大家交个朋友吧!
 
这是我调用存储过程的例子:
建立的method:
procedure ryts(_fh, _gh, _xm: OleVariant;
_rq: TDateTime);
safecall;
中间层:
procedure Trskqglxt.ryts(_fh, _gh, _xm: OleVariant;
_rq: TDateTime);
begin
ADOryts.Edit;
ADOryts.Parameters[1].Value:=_fh;
ADOryts.Parameters[2].Value:=_gh;
ADOryts.Parameters[3].Value:=_xm;
ADOryts.Parameters[4].Value:=_rq;
ADOryts.Prepared;
ADOryts.ExecProc;
ADOryts.Post;
end;


客户端:
datamodule1.Clientryts.close;
datamodule1.SocketConnection1.AppServer.ryts(trim(edit1.Text),trim(edit2.text),trim(edit3.text),datetimepicker1.Date);
datamodule1.Clientryts.Open;
 
我猜你的方法不是在TypeLibary中建立的,你像dark_eagle说的那样建立方法,在能在客户端
得以调用。
widestring 才是和window平台兼容的数据类型,在应用程序间调用的接口参数好象都得为
WideString
 
to: dark_eagle
谢谢了,这个我以前用过的,是用在电子商务里的,呵呵
这次不知怎么回事,就没有想到这,还是用两层的方法,谢谢你
那我的第一个问题你知不知道是怎么回事?
 
哈哈,只知其二不知其一. 知之为知之,不知为不知.
 
to: dark_eagle
你没开qq呀?
 
多人接受答案了。
 
后退
顶部