如何在DataSnap/Com+的多层分布式系统中正确的使用存储过程 ( 积分: 100 )

  • 主题发起人 主题发起人 flytalent
  • 开始时间 开始时间
F

flytalent

Unregistered / Unconfirmed
GUEST, unregistred user!
各位大侠!
我正在用DataSnap/Com+来开发多层分布式应用系统,其中数据库逻辑使用存储过程,查询更新等操作都是通过客户端向中间层传递存储过程的输入参数来调用的。目前我在中间层建立了协调对象和数据对象。基本模式是:客户端<--->协调对象<--->数据对象<--->数据库
但是我不知道存贮过程在中间层的对象中该如何写,应该写在什么位置,如何正确的返回输出参数?客户端又该如何正确调用?
谢谢!!
 
各位大侠!
我正在用DataSnap/Com+来开发多层分布式应用系统,其中数据库逻辑使用存储过程,查询更新等操作都是通过客户端向中间层传递存储过程的输入参数来调用的。目前我在中间层建立了协调对象和数据对象。基本模式是:客户端<--->协调对象<--->数据对象<--->数据库
但是我不知道存贮过程在中间层的对象中该如何写,应该写在什么位置,如何正确的返回输出参数?客户端又该如何正确调用?
谢谢!!
 
1。你可以在中间层建立一个自己的接口,客户端通过这个接口来传递参数,并在这个接口的过程里写调用存储过程插入数据的代码。(和在本地一样的)
2。TADOStoredProc和TADOQuery和TADODataSet如果用EXEC 过程名,+参数的方式调用存储过程其实区别其实都不大,还是和本地一样的,多了个TDataSetProvider。
 
哈,谢谢mnbsg的指点,我正是这么做的,我会及时给分的
 
呵呵,我是业余爱好而已,相互学习而已。
 
在问mnbsg老兄一个问题:
我的MIDAS/COM+系统中使用的都是存储过程,只需要通过客户端向协调对象传递参数,协调对象调用存储过程来通过数据对象操作数据,这样的话,我是否只在数据对象中用一个ADOQUERY,在协调对象中用一个DCOM连接它即可操作所有的数据表了,而不用象李维的书中那样为每个表建立一个数据对象再在协调对象中分别通过不同的DCOM连接。不知道我的这种想法是否合理?谢谢
 
//执行存储过程
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);
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
FreeAndNil(MTS_StoredProc);
end;

end;
 
中间层以接口方式连接数据库,客户端连接中间层,然后以接口输入参数就可以。
 
多人接受答案了。
 
后退
顶部