如何知道 Stored Procedure 已正確執行完成 |
尚未結案
|
m1594
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2003-02-28 發送簡訊給我 |
各位前輩好,小弟目前遇到的問題是,呼叫一個 Stored Procedure 後,馬上去select 此 Procedure 有Insert 資料的Table,可是卻無法得到正確的結果,等程式執行完,再去 SQL Query 下指令,就可以得到正確的結果。所以我在呼叫 SP 後,加入延遲程式測試,果然就可以得到正確的結果。我現在已經試過把 select 的時間放在 SP 的AfterClose 裡,還是沒辦法得到正確的結果,到底要怎麼樣才能確定 SP 已經正常做完呢?即使我在程式加中斷點,再去 SQL Query 看,也已經 Update 資料庫了,為什麼在 Delphi 下的ADOQuery無法得到正確的結果呢?多謝了!
PS:ADOQuery select 時,數值資料是 -1, 文字資料會是 "to be processed"
|
hahalin
版主 ![]() ![]() ![]() ![]() ![]() ![]() 發表:295 回覆:1698 積分:823 註冊:2002-04-14 發送簡訊給我 |
|
m1594
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2003-02-28 發送簡訊給我 |
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
|
yachanga
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:24 回覆:335 積分:296 註冊:2003-09-27 發送簡訊給我 |
引言: 各位前輩好,小弟目前遇到的問題是,呼叫一個 Stored Procedure 後,馬上去select 此 Procedure 有Insert 資料的Table,可是卻無法得到正確的結果,等程式執行完,再去 SQL Query 下指令,就可以得到正確的結果。所以我在呼叫 SP 後,加入延遲程式測試,果然就可以得到正確的結果。我現在已經試過把 select 的時間放在 SP 的AfterClose 裡,還是沒辦法得到正確的結果,到底要怎麼樣才能確定 SP 已經正常做完呢?即使我在程式加中斷點,再去 SQL Query 看,也已經 Update 資料庫了,為什麼在 Delphi 下的ADOQuery無法得到正確的結果呢?多謝了! PS:ADOQuery select 時,數值資料是 -1, 文字資料會是 "to be processed"Hi m1594: 小弟也有遇到這類問題,因為我也不確定procedure 什麼時候跑完. 後來我的解法是: 在procedure 最後一行寫log, insert 一筆record到一個新table.. 您只要定時去新table 找看看有沒有新record.. 如果有就是跑完了.. 不知道其他大大有沒有更好的方法 |
m1594
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2003-02-28 發送簡訊給我 |
不好意思,沒有說清楚我的環境
1.DB 是用 SQL2000
2.store procedure 的開啟方式,Open 和 Exec 都試過,會是一樣的情形
3.store procedure 由於是別的公司寫的,可能沒辦法全貼上來,最後一段有Return (ReturnVal)值回來,但是ADOStoredProc 沒有辦法得到這個參數(會是因為不是在一開始處宣告的關係嗎?),如果能抓到這個值,應該可以解決問題了。 ... DECLARE @ReturnVal int
declare @MSG_STR char(20)
select @MSG_STR = CONVERT(char(20), @MSG_ID)
execute @ReturnCode = sp_PostDealToExec 'FX', @MSG_STR, @DATE_TIME, @Source, @OriginalID, @LimitCheckTimeout, @ReturnVal out if @LimitCheckTimeout = 0 or @LimitCheckTimeout IS NULL
BEGIN
select @MSG_ID
END
ELSE
BEGIN
IF(@ReturnVal IS NULL)
BEGIN
SELECT -1
END
ELSE
BEGIN
SELECT @ReturnVal
END
END
|
change.jian
版主 ![]() ![]() ![]() ![]() ![]() 發表:29 回覆:620 積分:439 註冊:2003-06-02 發送簡訊給我 |
我之前是這樣做的,我的後端資料庫是sybase ,在store procedure裡最後會回傳一個dataset回來,而回傳的dataset內容會依據傳入的store procedure的參數而決定,我用TQuery去跑,在SQL裡直接下以下指令:
DECLARE @STARTDATE DATETIME
EXEC GET_DATASET @STARTDATE
然後,呼叫TQuery.open來執行.該store procedure會把資料組合在一個temp的table裡,最後回傳該table的內容回來
你可以試試看這樣做行不行,另外,如果說你要取得某個回傳值,那就用TStoredProc,然後設定對應的參數,最後檢查回傳的值.如果你要得到@ReturnVal,那應該用TStoredProc才是.
|
m1594
一般會員 ![]() ![]() 發表:1 回覆:6 積分:1 註冊:2003-02-28 發送簡訊給我 |
|
l630521
資深會員 ![]() ![]() ![]() ![]() ![]() 發表:15 回覆:349 積分:372 註冊:2003-02-17 發送簡訊給我 |
store procedure 由於是別的公司寫的,可能沒辦法全貼上來,最後一段有Return (ReturnVal)值回來,但是ADOStoredProc 沒有辦法得到這個參數(會是因為不是在一開始處宣告的關係嗎?),如果能抓到這個值,應該可以解決問題了。
ADOStoredProc應該可以得到ReturnVal的值,你的問題只要取得這個回傳值就解決了
ADOStoredProc1.Parameters.ParamByName('@ReturnVal').Value就可以取回@ReturnVal的值了。 Ian
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |