答案是可以的!测试环境:Oracle9i Delphi7 ADO SocketConnection--表 create table tab1(id number,bookname varchar(10))--插入记录 insert into tab1 values(1,'book_name')--过程 create or replace procedure p(v1 in number,v2 out varchar) is begin select bookname into v2 from tab1 where id = v1 and rownum <= 1; end;--在Oracle中测试 set serveroutput ondeclare result tab1.bookname%type; begin p(1,result); dbms_output.put_line(result); end;显示book_name--服务器端程序 在Delphi7中创建Remote Data Module,放入ADOConnection1,ADOStoredProc1,DataSetProvider1控件,设置好数据库连接和ADOStoredProc1的两个参数(一个名称叫v1,input类型,另一个名称叫v2,output类型),打开ScktSrvr.exe,端口为默认的211。--客户端程序 创建工程,设置好SocketConnection1和ClientDataSet的连接属性,放一个按钮在单击事件中: procedure TForm1.Button1Click(Sender: TObject); begin ClientDataSet.Execute; ShowMessage(ClientDataSet.Params.ParamByName('v2').AsString); end; 弹出字符串book_nameEmail:[email protected]
create table tab1(id number,bookname varchar(10))--插入记录
insert into tab1 values(1,'book_name')--过程
create or replace procedure p(v1 in number,v2 out varchar) is
begin
select bookname into v2 from tab1 where id = v1 and rownum <= 1;
end;--在Oracle中测试
set serveroutput ondeclare
result tab1.bookname%type;
begin
p(1,result);
dbms_output.put_line(result);
end;显示book_name--服务器端程序
在Delphi7中创建Remote Data Module,放入ADOConnection1,ADOStoredProc1,DataSetProvider1控件,设置好数据库连接和ADOStoredProc1的两个参数(一个名称叫v1,input类型,另一个名称叫v2,output类型),打开ScktSrvr.exe,端口为默认的211。--客户端程序
创建工程,设置好SocketConnection1和ClientDataSet的连接属性,放一个按钮在单击事件中:
procedure TForm1.Button1Click(Sender: TObject);
begin
ClientDataSet.Execute;
ShowMessage(ClientDataSet.Params.ParamByName('v2').AsString);
end;
弹出字符串book_nameEmail:[email protected]
使用DCOMConnection和SocketConnection只是代表使用了不同的连接协议,只要应用服务器是使用MIDAS技术,应用服务器都是用同一应用服务器接口实现的,即IAppServer.
你可以通过在Delphi的View ----> Type Library 打开应用服务器接口设定来定义服务器接口。在打开的窗口中你能发现一个以字母I 打头以你的应用服务器名命名的接口,右击该接口添加方法,在方法的Parameters中设置你要传递的参数, 注意参数的Modifier设定,[in]代表传入,[out]代表传出, [in,out]代表双向。根据你参数的传递情况进行设置即可。
完成设定之后,你可在Servers_TLB中见到该接口的具体定义。
在你应用服务器应用的远程数据模块单元中,已经有你服务器方法的定义了。你只需要实现你的参数传递即可。调用方法ClientDataSet中有AppServer。
學習先:
謝謝hewei2003() (回答,為什麼我在測試的時候會提示我 無狀態的服務是不行的那
我的環境是: C++ Buider 6.0 SocketConnection ,SQL Server 2000
謝謝 webstorm(mars) ( 你的方法我會去測試一下,不過可否有案例>請大家討論~
我使用的是 SocketConnection 的连接方式。我在服务器中写了一个涵数如:procedure TServer_Account.SetAccountCon(ZT_CODE: OleVariant;
var ISCON: WordBool);
begin
if ZT_CODE = 'A' then
ISCON := Ture
else ISCON := False ;
end;其中 ISCON 为out 输出参数到客户端中。
然后在客户端中调用方法 SocketConnection 的 AppServer 。
如:SocketConnection1.AppServer.SetAccountcon(t_str,t_bit) ;现在的问题是:
1、如果中间层程序放在开发中间层的电脑上时,再运行程序,不会出错。
2、如果把中间层放到另一台电脑上再运行时出错!
提示为:Invalid Variant type conversion.
(可能是没有注册相应的涵数)请问这样的问题如何处理?如何注册相应的涵数!(中间层程序运行没有问题!)
如果你的SetAccountcon 是在IAppServer接口中实现的方法的话,只要中间层服务器程序运行无问题的话,说明你的服务器端配置没有太大问题,但你需要保证客户端有相应的权限,能够下载IAppServer接口以调用你的方法,它是不需要注册的。
我也不知道为什么会产生你那个错误,“无状态”我的理解是没有属性的对象。
无状态并不是没有属性,它是不能为某个客户端保持特征值,使服务器可同时服务更多客户,也使系统的容错性能增强。