2014-10-30 65 views
-1

任何人都可以帮助我从一个存储过程捕获一个输出变量在delphi变量吗? 我在其他的问题在这里已经看,几乎没有成功实施德尔福存储过程输出

目前,我有一个存储过程:

DELIMITER $$ 

CREATE DEFINER=`root`@`localhost` PROCEDURE `return_10`(out x varchar(5)) 
BEGIN 
    SET x = 10; 

END 

正如你可以看到它是一个非常基本的程序。

在德尔福我想调用这个过程并捕获输出变量,并尝试了以下,但我有一种感觉它的错误。

实现:

var 
    stored_proc: TADOStoredProc; 

(* GETTING A RETURN VALUE FROM A STORED PROCEDURE *) 

stored_proc.ProcedureName := 'return_10'; 
stored_proc.Parameters.Clear; 
stored_proc.Parameters.CreateParameter('@RETURN_VALUE', ftInteger, pdReturnValue, 10, null); 
stored_proc.ExecProc; 
lbl_connected.Caption := stored_proc.Parameters.ParamByName('@RETURN_VALUE').Value 
+0

为什么你认为这是错的?当你运行它会发生什么?你预期会发生什么? – 2014-10-30 15:29:22

+0

在两个参数语句中删除'@'。 Delphi不使用它们。 – 2014-10-30 16:11:04

+0

['Déjàvu'](http://stackoverflow.com/q/26489266/960757) – TLama 2014-10-30 16:12:59

回答

1

正如你可以放置一个TAdoStoredProc窗体/数据模块上一般建议,分配财产ProcedureName并检查参数。
另一种方式可能是为参数添加调试输出。

由于我没有能力的MySQL,我只能显示一个SQL-Server过程的结果:

CREATE PROCEDURE return_10(@x varchar(5) OUT) 
AS 
BEGIN 
    Set @x=10; 
    Return 1; 
END 

从DebugParams显示的参数在这里:

@RETURN_VALUE 
@x 

哪里@ RETURN_VALUE将是一个用于状态或ID的值
和@x将通过我们的过程的参数完全按过程声明中的名称命名。

您不必添加或创建任何参数,只需要调用Refresh分配ProcedureName 后,适应它可能没有设置正确的Direction

Procedure DebugParams(ads:TAdoStoredProc); 
Var 
I:Integer; 
sl:TStringList; 
begin 
     sl:=TStringList.Create; 
     try 
     for I := 0 to ads.Parameters.Count - 1 do 
     begin 
      sl.Add(ads.Parameters[i].Name); 
     end; 
     Showmessage(sl.Text); 
     finally 
     sl.Free; 
     end; 
end; 

procedure TForm7.Button1Click(Sender: TObject); 
begin  
    stored_proc.ProcedureName := 'return_10'; 
    stored_proc.Parameters.Clear; 
    stored_proc.Parameters.Refresh; 
    DebugParams(stored_proc); 
    stored_proc.Parameters.ParamByName('@x').Direction := pdOutput; 
    stored_proc.ExecProc; 
    Caption := stored_proc.Parameters.ParamByName('@x').Value; 
end;