2014-10-30 53 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;