如何从存储过程返回所有值?

时间:2009-05-29 19:45:29

标签: sql delphi stored-procedures

原谅我的天真,但我不熟悉将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;

4 个答案:

答案 0 :(得分:8)

调用Open以获取返回的数据集

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

答案 1 :(得分:3)

使用“打开”从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是否更改了返回列的顺序。

答案 2 :(得分:2)

如果存储过程返回结果集(数据行),请不要使用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,但我不是百分之百确定。

答案 3 :(得分:0)

看看这个(只是用Google搜索):

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

基本上,SQL Server存储过程总是返回一个返回值,但它也可以创建一个结果集,您需要处理该结果集,就像从常规select语句返回的数据集一样。