1、//存储过程参数结构,只定义了常用的部分,如果需要自己加吧<br>type<br> TParameter_ = record<br> Name: WideString;<br> Type_: LongWord;<br> Direction: LongWord;<br> Size: Longint;<br> Value: OleVariant;<br> end;<br><br> TParameters_ = array of TParameter_;<br><br>//cnn 是 Connection对象,cmd 是 Command 对象,rst 是 Recordset 对象,prc 是存储过程命令行,prms 是参数集合<br>function ExecProc(cnn, cmd, rst: OleVariant; const prc: string; prms: TParameters_): Boolean;<br>var<br> i: Longint;<br>begin<br> Result := not (VarIsEmpty(cnn) or VarIsEmpty(cmd)) and (cnn.State = adStateOpen);<br> if Result then<br> begin<br> try<br> cmd.CommandText := prc;<br> cmd.CommandType := adCmdStoredProc;<br> cmd.ActiveConnection := cnn;<br><br> //之前,将我们自己的参数集合中的输入参数添入 Command 参数集合<br> for i := Low(prms) to High(prms) do<br> case prms.Direction of<br> //未知类型的参数(adParamUnknown)既不算作输入参数也不算作输出参数<br> adParamInput, adParamInputOutput:<br> cmd.Parameters[prms.Name].Value := prms.Value;<br> end;<br><br> rst := cmd.Execute;<br><br> //之后,将输出参数从 Command 参数集合读取到我们自己的参数集合<br> for i := Low(prms) to High(prms) do<br> case prms.Direction of<br> //未知类型的参数(adParamUnknown)既不算作输入参数也不算作输出参数<br> adParamOutput, adParamInputOutput:<br> prms.Value := cmd.Parameters[prms.Name].Value;<br> adParamReturnValue:<br> prms.Value := cmd.Parameters[0].Value;<br> end;<br> except<br> Result := False;<br> end;<br> end;<br>end;<br>2、下面是一个例子:<br>//执行存储过程<br>(*<br>CREATE PROCEDURE GetProductName<br> @ProductID int,<br> @ProductName varchar(50) OUTPUT<br>AS<br>SELECT @ProductName = ProductName<br>FROM Products<br>WHERE ProductID = @ProductID<br>RETURN @ProductID<br>*)<br>procedure TForm1.Button3Click(Sender: TObject);<br>var<br> prms: TParameters_;<br>begin<br> SetLength(prms, 3);<br> //参数 0 接收返回值;Name 取什么都行,但 Direction 必须标明为adParamReturnValue<br> prms[0].Name := '@RETURN_VALUE';<br> prms[0].Direction := adParamReturnValue;<br> //参数 1 作为输入参数,Name 必须与实际参数名相同,Direction 标明 adParamInput<br> prms[1].Name := '@ProductID';<br> prms[1].Direction := adParamInput;<br> prms[1].Value := 8;<br> //参数 2 作为输出参数,Name 必须与实际参数名相同,Direction 标明 adParamOutput<br> prms[2].Name := '@ProductName';<br> prms[2].Direction := adParamOutput;<br> //执行存储过程;如果不需要 Recordset 对象接收返回的数据集,就把它置空<br> ExecProc(cnn, cmd, Null, 'GetProductName', prms);<br> ShowMessage(prms[0].Value);<br> ShowMessage(prms[2].Value);<br>end;<br>3、更多更具体的见我的文章,里面说的很清楚。以后要多看 vvyang 的文章,谢谢!<br>http://www.delphibbs.com/delphibbs/dispq.asp?lid=3047846