2009-05-29 42 views
3

原諒我的天真,但我對使用Delphi與數據庫(這可能看起來有些奇怪)是新手。如何返回存儲過程中的所有值?

我已經使用TADOConnection建立了與我的數據庫(MSSQL)的連接。我正在使用TADOStoredProc來訪問我的存儲過程。

我的存儲過程返回2列,一列填滿服務器名稱,第二列填滿服務器上的用戶。它通常返回大約70條記錄......不是很多數據。

如何以編程方式枚舉此存儲過程?我能夠在我的表單上放置一個DBGrid並將其附加到TDataSource(然後附加到我的ADOStoredProc),並且我可以驗證數據是否正確檢索。

理想情況下,我想枚舉返回的數據並將其移入TStringList。

目前,我使用下面的代碼來枚舉ADOStoredProc,但它只返回 '@RETURN_VALUE':

ADOStoredProc1.Open; 
ADOStoredProc1.ExecProc; 
ADOStoredProc1.Parameters.Refresh; 

for i := 0 to AdoStoredProc1.Parameters.Count - 1 do 
begin 
    Memo1.Lines.Add(AdoStoredProc1.Parameters.Items[i].Name); 
    Memo1.Lines.Add(AdoStoredProc1.Parameters.Items[i].Value); 
end; 

回答

8

調用open得到一個數據集返回

StoredProc.Open; 
while not StoredProc.EOF do 
begin 
    Memo1.Lines.Add(StoredProc.FieldByName('xyz').Value); 
    StoredProc.Next; 
end; 
0

看看這個(只是GOOGLE了它):

[http://www.scip.be/index.php?Page=ArticlesDelphi12&Lang=EN#Procedure][1] 

基本上,SQL Server存儲過程總是返回一個返回值,但它也可以創建一個結果集,您需要像從常規select語句返回的數據集那樣處理結果集。

2

如果您的存儲過程返回結果集(數據行),請不要使用ExecProc。它旨在執行沒有結果集的過程。使用開放式或主動代替,然後就可以處理它們,就像你使用參數:

ADOStoredProc.Open; 

for i := 0 to ADOStoredProc1.Parameters.Count - 1 do 
begin 
    Memo1.Lines.Add(ADOStoredProc1.Parameters.Items[i].Name); 
    Memo1.Lines.Add(ADOStoredProc1.Parameters.Items[i].Value); 
end; 

BTW,調用打開,然後ExecProc引起的問題; Open返回一個結果集,然後ExecProc將清除它,因爲您第二次運行該過程而沒有預期的結果集。我也不認爲你需要參數。刷新,但我不是100%肯定的。

+1

當代碼循環訪問Parameters集合時SP是否返回結果集是否重要?即這個代碼不會返回與OP相同的結果嗎? (免責聲明:我不是Delphi程序員,所以也許我誤解了這個問題......) – Matt 2009-05-29 23:44:09

+0

當然很重要。 OP使用Open獲得結果集,然後使用ExecSQL丟棄結果集,不留任何循環。刪除ExecSQL並使用Open(或Active:= True)會留下結果集進行迭代。 IOW,這與OP的結果並不相同。 :-) – 2009-05-29 23:54:03

3

使用打開,從StoredProc
使用或者設計時字段得到記錄,即席場搶下與FieldByName循環或字段[NN前]來獲取值。

procedure GetADOResults(AStoredProc: TADOStoredProc; AStrings: TStrings); 
var 
    fldServer, fldUser: TField; 
begin 
    AStoredProc.Open; 
    fldServer := AStoredProc.FieldByName('ServerName'); 
    fldUser := AStoredProc.FieldByName('User'); 
    while not AStoredProc.EOF do 
    begin 
    AStrings.Add(Format('Server: %s -/User: %s',[fldServer.AsString, fldUser.AsString])); 
    // or with FFields and Index (asumming ServerName is the 1st and User the 2nd) and no local vars 
    AStrings.Add(Format('Server: %s -/User: %s',[AStoredProc.Fields[0].AsString, AStoredProc.Fields[1].AsString])); 
    AStoredProc.Next; 
    end; 
end; 


//use like 
    GetADOResults(ADOStoredProc1, Memo1.Lines); 

注意:Fields [nn]允許編寫較少的代碼,但要注意StoredProc是否更改返回列的順序。