如何在三层架构里使用ADOStoredProc1在线等待,急呀

yangzong20 2011-04-26 04:30:56
我把原来两层的架构改成三层的

服务端使用
ADOConnection1+ADOQuery1+DataSetProvider1

客户端是用
SocketConnection1+ClientDataSet1

但现在我遇到一个问题,我在原来两层里面用了一个ADOStoredProc1来调用存储过程(用的是Oracle数据库)但现在在三层架构里如何用这个控件来连中间层呢?小弟弟在线等待,麻烦大哥们帮帮忙谢谢

...全文
107 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
lyhoo163 2011-04-29
  • 打赏
  • 举报
回复
使用TSocketConnection的ConnectionString属性。连接
Oraclers 2011-04-28
  • 打赏
  • 举报
回复
to Oraclers
我用了你的方法还是不行呀


客戶端執行前需傳遞參數。
procedure TFADM.cdsAutoNumberBeforeExecute(Sender: TObject;
var OwnerData: OleVariant);
begin
OwnerData := AutoNoParam;
end;
yangzong20 2011-04-27
  • 打赏
  • 举报
回复
to Oraclers
我用了你的方法还是不行呀

我在网上看了一个例子是直接用ClientDataSet1来调用的代码如下


form2.ClientDataSet3.Close;
form2.ClientDataSet3.params.clear ;
form2.ClientDataSet3.Params.CreateParam(ftString,'ParamName1',ptInput) ;
form2.ClientDataSet3.Params.CreateParam(ftString,'ParamName2',ptInput) ;
form2.ClientDataSet3.Params.CreateParam(ftBCD,'ParamName3',ptOutput) ;
form2.ClientDataSet3.CommandText:='{call SP_LOGIN(?,?)}'; //这里是调用用户登录的存储过程 把用户名和密码传进去如果通过就返回0否则返回-1
form2.ClientDataSet3.Params.ParamByName('ParamName1').Value:='102704';
form2.ClientDataSet3.Params.ParamByName('ParamName2').Value:='060105';
form2.ClientDataSet3.open ;


但运行到form2.ClientDataSet3.Params.ParamByName('ParamName1').Value:='102704'; 这句的时候报以下错误这是为何?麻烦帮看看万分感谢
ClientDataSet3:Paramete 'ParamName1' not found
Oraclers 2011-04-27
  • 打赏
  • 举报
回复
在客戶端用一個用一個TSocketConnection 連接到中間層服務器,用TClientDataSet去調用中間層的TDataSetProvider,ClientDataSet的RemoteServer層性設置為SocketConnection1(就是前面已建立的連接),ProviderName屬性設為中間層中TDataSetProvider的名字,本例中就是dspAutoNumber。下面是客戶端調用產生“固定資產編號”的代碼:
//AutoNoParam : OleVariant;{自動產生編號的參數}
procedure TEditForm.sbtnAssetsNoClick(Sender: TObject);
begin
with FADM do
try
try
AutoNoParam := VarArrayCreate([0,2],varVariant);//設置輸入參數
cdsAutoNumber.Params.Clear;
AutoNoParam[0] := cdsFAClone.FieldValues['City'];
AutoNoParam[1] := cdsFAClone.FieldValues['AccountMoney'];
AutoNoParam[2] := cdsFAClone.FieldValues['CorpName'];
cdsAutoNumber.Execute;
cdsFAClone.FieldValues['AssetsNo'] := sAssetsNo; //執行後事件將返回的“固定資產編號”賦值給sAssetsNO,這裡將sAssetsNo編號賦值給一個編輯固定資產的ClientDataSet
except
ShowMessage('未能正确產生編號,請檢查入帳金額﹑所在城市﹑所屬公司等輸入是否正确﹗');
end;
finally
VarClear(AutoNoParam);
end;

end;
//cdsAutoNumber執行後事件代碼:
{自動產生資產號后,取得產生的資產號}
procedure TFADM.cdsAutoNumberAfterExecute(Sender: TObject;
var OwnerData: OleVariant);
begin
if not ((VarIsEmpty(OwnerData)) or (VarIsNull(OwnerData))) then
sAssetsNo := OwnerData;
end;
Oraclers 2011-04-27
  • 打赏
  • 举报
回复
下面的代碼是中間層的,用ADOStoredProc1调用储存过程,用DataSetProvider1返回参数。
{自動產生“固定資產編號”過程執行后返回編號﹒}
procedure TFAUpdateData.dspAutoNumberAfterExecute(Sender: TObject;
var OwnerData: OleVariant);
begin
if spAutoNumber.Parameters.ParamByName('@RETURN_VALUE').Value = 0 then
OwnerData := spAutoNumber.Parameters.ParamByName('@AssetsNumber').Value
else
OwnerData := 'Invalidity';
end;

{產生“固定資產編號“}
procedure TFAUpdateData.dspAutoNumberBeforeExecute(Sender: TObject;
var OwnerData: OleVariant);
begin
if not ((VarIsEmpty(OwnerData)) or (VarIsNull(OwnerData))) then
with spAutoNumber.Parameters do
begin
ParamByName('@City').Value := OwnerData[0];
ParamByName('@Value').Value := OwnerData[1];
ParamByName('@Corp').Value := OwnerData[2];
end else
with spAutoNumber.Parameters do
begin
ParamByName('@City').Value := '';
ParamByName('@Value').Value := -1;
ParamByName('@Corp').Value := '';
end;

end;

{Procedure TFAUpdateData.dspAddModeAfterExecute Return a Value.所有
返回值為@RETURN_VALUE都調用這個過程﹒}
procedure TFAUpdateData.dspAddModeAfterExecute(Sender: TObject;
var OwnerData: OleVariant);
var spDataSet : TDataSet;
begin
spDataSet := TDataSetProvider(Sender).DataSet; {得到過程執行時的數据集}
OwnerData := TADOStoredProc(spDataSet).Parameters.ParamByName('@RETURN_VALUE').Value;
end;
yangzong20 2011-04-26
  • 打赏
  • 举报
回复
to Oraclers
那用ADOStoredProc1如何连接中间层呀,我看了里面没有连接SocketConnection1的选项呀
麻烦你能不能说得明白些如何关联,万分感谢
Oraclers 2011-04-26
  • 打赏
  • 举报
回复
还是用ADOStoredProc1调用储存过程,用DataSetProvider1返回参数。
yangzong20 2011-04-26
  • 打赏
  • 举报
回复
说明一点我调用的存储过程是带参数和返回值的(不是返回数据集是几个值)
yangzong20 2011-04-26
  • 打赏
  • 举报
回复
to ljz9425

还有没有其他的方法呢?在三层架构的情况下如何调用Oracle的存储过程呢?
whisht 2011-04-26
  • 打赏
  • 举报
回复
Oracle用ODAC组件吧

5,379

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧