簡體   English   中英

如何從存儲過程返回所有值?

[英]How do I return all values from a stored procedure?

請原諒我的天真,但我不熟悉將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;

調用Open以獲取返回的數據集

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

使用“打開”從StoredProc獲取記錄
使用設計時字段,在循環之前使用FieldByName獲取的臨時字段或使用Fields [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是否更改了返回列的順序。

如果存儲過程返回結果集(數據行),請不要使用ExecProc。 它旨在執行沒有結果集的過程。 使用Open或Active,然后您可以像使用參數一樣處理它們:

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,調用Open然后執行ExecProc會導致問題; Open返回一個結果集,ExecProc然后清除它,因為你第二次運行該過程而沒有預期的結果集。 我也認為你不需要Parameters.Refresh,但我不是百分之百確定。

看看這個(只是用谷歌搜索):

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM