Как вернуть все значения из хранимой процедуры? - PullRequest
3 голосов
/ 29 мая 2009

Простите за наивность, но я новичок в использовании Delphi с базами данных (что может показаться странным для некоторых).

Я установил соединение с моей базой данных (MSSQL), используя TADOConnection. Я использую TADOStoredProc для доступа к моей хранимой процедуре.

Моя хранимая процедура возвращает 2 столбца, столбец, полный имен серверов, и 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 ]

8 голосов
/ 30 мая 2009

Позвоните, чтобы получить возвращенный набор данных

StoredProc.Open;
while not StoredProc.EOF do
begin
  Memo1.Lines.Add(StoredProc.FieldByName('xyz').Value);
  StoredProc.Next;
end;
3 голосов
/ 30 мая 2009

Используйте Open, чтобы получить записи из 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 изменяет порядок возвращаемых столбцов.

2 голосов
/ 30 мая 2009

Если ваша хранимая процедура возвращает набор результатов (строки данных), не используйте 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;

Кстати, вызов Open, а затем ExecProc вызывает проблемы; Open возвращает набор результатов, ExecProc затем очищает его, потому что вы запускаете процедуру во второй раз без ожидаемого набора результатов. Я также не думаю, что вам нужны Parameters.Refresh, но я не уверен на 100% в этом.

0 голосов
/ 30 мая 2009

Взгляните на это (просто погуглил):

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

По сути, хранимая процедура SQL Server всегда возвращает одно возвращаемое значение, но она также может создавать набор результатов, который необходимо обрабатывать так же, как набор данных, возвращаемый из регулярного оператора выбора.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...