当前位置:主页>仓库管理软件> 列表

如何在三层结构的客户段调用存储过程? 找金蝶财务软件的好处

进销存软件版1楼: 初学三层结构,请问如何调用?

2楼: 中间层:MyExecProc(ProcName : WideString ...)
客户端:远程调用 MyExecProc 如医药进销存系统

3楼: 谢谢,能不能再详细点?
可不可以不用在中间层写代码,用控件的方式来调用?

4楼: 中间层可以用TStoredProc、或TADOStoredProc,由MyExecProc方法调用

5楼: 恕我愚昧,不明白具体的过程该怎么实现。麻烦您讲清楚点啦![:(]
问题在,客户端如何你调用或者触发中间层的控件执行存储过程?

6楼: 就是在中间层接口上定义一个方法,自己用Type Library加一个方法,例如。
MyExecProc(ProcName : WideString ...)
实现该接口。
上面的接口是通过一个名称来判断执行那个存储过程,如果你的存储过程有参数,那么你要定义自己的数据结构。
在中间层上,你可以用ADO控件来执行了。
如果你不想定义新的接口的话,你也可以用TclientDataSet的Commandtext里面用exec来执行。

进销存软件版7楼: 其實也就好象調用本地函數或過程一樣。只是多了遠程調用接口來實現。具體的話你可以參考李維寫的分步式開發。

8楼: //中间层
function TSocialInsurance.MTS_ExecProc(const AiHosCode: WideString;
AiTermInfo, AiBuffer01, AiBuffer02: OleVariant; out AoBuffer01,
AoBuffer02, AoMsg: OleVariant): OleVariant;
Var
i, iParamInLowBound, iParamInHighBound, iParamInCount, iParamOutCount : Integer;
DoTrans : Boolean;
rdTermInfo : TrdTermInfo;
MTS_StoredProc : TStoredProc;
sMsg : String;
begin
Result := -1;
SetTermInfo(AiTermInfo, rdTermInfo);
UserLog(AiHosCode, rdTermInfo, AiBuffer02[1] + ''/'' + AiBuffer02[0]);
DoTrans := (AiBuffer02[0]=''T''); //T处理事务/F不处理事务
If DoTrans 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_StoredProc Do Begin
Close;
DatabaseName := _DBName;
StoredProcName := UpperCase(AiBuffer02[1]);
Prepare;
iParamOutCount := ParamCount - iParamInCount;
For i := iParamInLowBound To iParamInHighBound Do
Params[i-iParamInLowBound].AsString := AiBuffer01[i];
ExecProc;
End;
//
AoBuffer01 := VarArrayCreate([0, iParamOutCount-1], VarOleStr);
For i := 0 To iParamOutCount-1 Do
AoBuffer01[i] := 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 ( DoTrans And MTS_Database.InTransaction ) Then MTS_Database.Commit;
UserLog(AiHosCode, rdTermInfo, AiBuffer02[1] + '':'' + sMsg);
Except
On E:Exception Do Begin


If ( DoTrans 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

9楼: FormDM.CDStemp.Close;
FormDM.CDStemp.CommandText:=''execute procedure ywdw_total(''+''''''''
+YWDW_ID+''''''''+'',''+''''''''+FormatDateTime(''yyyy"-"mm"-"dd'',EndDate)+''''''''+'',''
+''''''''+UserName+''''''''+'')'';
FormDM.CDStemp.Execute;

10楼: ... 客戶端調用函數,由中間層去執行存儲過程

你這個立題就不妥

11楼: 定義一個函數﹐
如果你要返回一個值﹐
就照它的類型定義返回值
如果你要返回一個數據集
就定義返回OLEVARIANT
再從客層獲取

12楼: 我给你二个例子
一个是DELPHI三层调用ADOQUERY的例子
一个是DELPHI调用ADOStoredProc1存储过程的例子


我没时间给你合并了。。
你自己研究一下吧。。ADOQUERY换成ADOStoredProc1就行了。。。
bbgsgs@163.com 如金蝶财务软件的好处

13楼: 先要明白其意﹐
才知道如何更新
我說得已經很清楚了

进销存软件版14楼: 给你一个最简单的调用:
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;

15楼: To:xianguo

谢谢xianguo。
我正想采用你的方法。
能否把参数说明一下,并给出一个简单的客户端调用实例?
nosya@sohu.com
再次感谢。

16楼: 帮顶!

http://www.source520.com

站长开发推广同盟 站长朋友的终极驿站
同时拥有海量源码电子经典书籍下载

http://www.source520.com/search/search.asp

"编程.站长"论坛搜索引擎-----为中国站长注入动力!