線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1872
推到 Plurk!
推到 Facebook!

SQL 預存函數如何取回傳回值?

答題得分者是:hahalin
superrakce
一般會員


發表:24
回覆:35
積分:11
註冊:2006-10-09

發送簡訊給我
#1 引用回覆 回覆 發表時間:2011-06-20 14:25:59 IP:114.33.xxx.xxx 訂閱
這是預存程式
[code sql]
CREATE PROC ImportOCAT
(
@NType int,@ocatid varchar(10),@ocatname nvarchar(50)
)
AS
BEGIN

select * from ocat where 分類代碼 = @ocatid
if @@ROWCount = 0 begin
insert into ocat (分類代碼,分類名稱) values (@ocatid,@ocatname)
return 1
end
else begin
if @NType ='2' begin
update ocat set 分類名稱 = @ocatname where 分類代碼 = @ocatid
return 2
end
else
return 3
end

END
GO

[/code]

Q1:為何錯誤?訊息為指定了太多參數
[code delphi]
var exlSP:Tadostoredproc;
begin
exlSP:=Tadostoredproc.Create(owner);
exlSP.Connection := form1.AQ.Connection ;
exlSP.ProcedureName := 'ImportOCAT';
exlSP.Parameters.CreateParameter('NType',ftInteger,pdInput,4,null);
exlSP.Parameters.CreateParameter('Ocadid',ftString,pdInput,10,null);
exlSP.Parameters.CreateParameter('ocadname',ftString,pdInput,50,null);
exlSP.Parameters.CreateParameter('ocatRet',ftInteger,pdReturnValue,1,null);
exlSP.Parameters.ParamByName('NType').Value := 1;
exlSP.Parameters.ParamByName('Ocadid').Value := '78';
exlSP.Parameters.ParamByName('ocadname').Value := '87';
exlSP.ExecProc;
showmessage(inttostr(exlSP.Parameters.ParamValues['ocatRet'] ));

[/code]


Q2:多重步驟OLE DB 操作發生錯誤,請檢查每一個可用的OLE DB

[code delphi]
VAR AQXLS: TADOQuery;
BEGIN
AQXLS.Connection := form1.AQ.Connection ;
AQXLS.SQL.Text := 'EXEC ImportOCAT :NType,:Ocadid,:ocadname';
AQXLS.Parameters.CreateParameter('NType',ftInteger,pdInput,4,null);
AQXLS.Parameters.CreateParameter('Ocadid',ftString,pdInput,10,null);
AQXLS.Parameters.CreateParameter('ocadname',ftString,pdInput,50,null);
AQXLS.Parameters.CreateParameter('ocatRet',ftInteger,pdReturnValue,1,null);
AQXLS.ExecSQL;

[/code]

Q3:若回傳的是Parameter 則將TParameterDirection 設為pdOutput?


ko
資深會員


發表:28
回覆:785
積分:444
註冊:2002-08-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2011-06-21 11:34:32 IP:61.66.xxx.xxx 訂閱
 您好:
首先請先確認您的proc是否可以在SQL上面執行
至於在程式的寫法我是都用您的Q2範例的方式執行
但不是用參數傳入的方式執行
而是直接給值 「exec proc 'ABC','1234'」
以上請參考
------
======================
昏睡~
不昏睡~
不由昏睡~
hahalin
版主


發表:295
回覆:1698
積分:823
註冊:2002-04-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2011-06-21 15:05:12 IP:64.62.xxx.xxx 未訂閱


[code delphi]
var qry:tadoquery;
ntype,ocatid,ocatname:string;
result:string;
begin
qry:=tadoquery.create(self);
qry.connection:= connection1 ; //<--给connection
//要给ntype,ocatid,ocatname 值
qry.sql.text:='exec importOCAT ' ntype ',' ocatid ',' ocatname;
result:="";
try
qry.open;
if (qry.bof <> qry.eof) then
result:=qry.fields[0].asstring;
finally
qry.free;
end;

//收工
end;
[/code]

編輯記錄
hahalin 重新編輯於 2011-06-21 01:06:20, 註解 無‧
hahalin 重新編輯於 2011-06-21 01:07:00, 註解 無‧
系統時間:2024-03-29 6:41:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!