如何在三层结构的客户段调用存储过程?(300分)

  • 主题发起人 主题发起人 rubyrobin
  • 开始时间 开始时间
R

rubyrobin

Unregistered / Unconfirmed
GUEST, unregistred user!
初学三层结构,请问如何调用?
 
中间层:MyExecProc(ProcName : WideString ...)
客户端:远程调用 MyExecProc
 
谢谢,能不能再详细点?
可不可以不用在中间层写代码,用控件的方式来调用?
 
中间层可以用TStoredProc、或TADOStoredProc,由MyExecProc方法调用
 
恕我愚昧,不明白具体的过程该怎么实现。麻烦您讲清楚点啦![:(]
问题在,客户端如何你调用或者触发中间层的控件执行存储过程?
 
就是在中间层接口上定义一个方法,自己用Type Library加一个方法,例如。
MyExecProc(ProcName : WideString ...)
实现该接口。
上面的接口是通过一个名称来判断执行那个存储过程,如果你的存储过程有参数,那么你要定义自己的数据结构。
在中间层上,你可以用ADO控件来执行了。
如果你不想定义新的接口的话,你也可以用TclientDataSet的Commandtext里面用exec来执行。
 
其實也就好象調用本地函數或過程一樣。只是多了遠程調用接口來實現。具體的話你可以參考李維寫的分步式開發。
 
//中间层
function TSocialInsurance.MTS_ExecProc(const AiHosCode: WideString;
AiTermInfo, AiBuffer01, AiBuffer02: OleVariant;
out AoBuffer01,
AoBuffer02, AoMsg: OleVariant): OleVariant;
Var
i, iParamInLowBound, iParamInHighBound, iParamInCount, iParamOutCount : Integer;
do
Trans : Boolean;
rdTermInfo : TrdTermInfo;
MTS_StoredProc : TStoredProc;
sMsg : String;
begin
Result := -1;
SetTermInfo(AiTermInfo, rdTermInfo);
UserLog(AiHosCode, rdTermInfo, AiBuffer02[1] + '/' + AiBuffer02[0]);
do
Trans := (AiBuffer02[0]='T');
//T处理事务/F不处理事务
Ifdo
Trans then
MTS_Database.StartTransaction;
MTS_StoredProc := TStoredProc.Create(Nil);
Try
Try
iParamInLowBound := VarArrayLowBound(AiBuffer01, 1);
iParamInHighBound := VarArrayHighBound(AiBuffer01, 1);
iParamInCount := iParamInHighBound - iParamInLowBound + 1;
With MTS_StoredProcdo
begin
Close;
DatabaseName := _DBName;
StoredProcName := UpperCase(AiBuffer02[1]);
Prepare;
iParamOutCount := ParamCount - iParamInCount;
For i := iParamInLowBound To iParamInHighBounddo
Params[i-iParamInLowBound].AsString := AiBuffer01;
ExecProc;
end;
//
AoBuffer01 := VarArrayCreate([0, iParamOutCount-1], VarOleStr);
For i := 0 To iParamOutCount-1do
AoBuffer01 := MTS_StoredProc.Params[iParamInCount + i].AsString;
If MTS_StoredProc.Params[iParamInCount + iParamOutCount-1].DataType = TFieldType(ftString) then
begin
sMsg := AoBuffer01[iParamOutCount-1];
Result := AoBuffer01[iParamOutCount-2];
End
else
begin
sMsg := AoBuffer01[iParamOutCount-2];
Result := AoBuffer01[iParamOutCount-1];
end;
AoMsg := sMsg;
//
If (do
Trans And MTS_Database.InTransaction ) then
MTS_Database.Commit;
UserLog(AiHosCode, rdTermInfo, AiBuffer02[1] + ':' + sMsg);
Except
On E:Exceptiondo
begin
If (do
Trans And MTS_Database.InTransaction ) then
MTS_Database.Rollback;
sMsg := AiBuffer02[1] + ':' + E.Message;
AoMsg := sMsg;
UserLog(AiHosCode, rdTermInfo, sMsg);
end;
end;
Finally
MTS_StoredProc.Close;
FreeAndNil(MTS_StoredProc);
end;

end;

//客户端
远程调用 ExecProc
 
FormDM.CDStemp.Close;
FormDM.CDStemp.CommandText:='execute procedure ywdw_total('+''''
+YWDW_ID+''''+','+''''+FormatDateTime('yyyy"-"mm"-"dd',EndDate)+''''+','
+''''+UserName+''''+')';
FormDM.CDStemp.Execute;
 
... 客戶端調用函數,由中間層去執行存儲過程
你這個立題就不妥
 
定義一個函數﹐
如果你要返回一個值﹐
就照它的類型定義返回值
如果你要返回一個數據集
就定義返回OLEVARIANT
再從客層獲取
 
我给你二个例子
一个是DELPHI三层调用ADOQUERY的例子
一个是DELPHI调用ADOStoredProc1存储过程的例子
我没时间给你合并了。。
你自己研究一下吧。。ADOQUERY换成ADOStoredProc1就行了。。。
bbgsgs@163.com
 
先要明白其意﹐
才知道如何更新
我說得已經很清楚了
 
给你一个最简单的调用:
create procedure M00001
@t_user varchar(4)
as
select * from T00001 where t_user=@t_user
go
Delphi7调用:
ClientDataSet1.close;
ClientDataSet1.command='Exec M00001 '+#39+Trim(Edit1.text)+#39;
ClientDataSet1.Execute;
 
To:xianguo
谢谢xianguo。
我正想采用你的方法。
能否把参数说明一下,并给出一个简单的客户端调用实例?
nosya@sohu.com
再次感谢。
 
帮顶!
http://www.source520.com
站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载
http://www.source520.com/search/search.asp
"编程.站长"论坛搜索引擎-----为中国站长注入动力!
 
后退
顶部