Конференция "Базы" » recordset... [D7]
 
  • istok20 © (10.02.12 12:42) [0]
    есть TADOStoredProc, возвращает пару полей, ничего особенного

    когда для оптимизации скорости обработки возвращаемого результата  перехожу на RecordSet (бегаю по нему, а не по датасету, так обычно намного быстрее) то в Fields[0..].Value бывает пустота вместо строк...

    в каких случаях так бывает? не могу понять.. в большинстве обработчиков резалтов рекордсетов всё ок, но в этом одном месте содержимое рекордсета пустое. а в датасете всё есть..
  • istok20 © (10.02.12 12:49) [1]
    т.е. этот код работает ок:

    var
     storedProc: TADOStoredProc;
     XmlSessions: TStream;
     i: Integer;
    begin
     storedProc := TADOStoredProc.Create(nil);
     try
       with storedProc do
       begin
         Connection := FConnection;
         ProcedureName := 'we_OrgUnits_GetOrgUnitsSessionSums';

         with Parameters.AddParameter do
         begin
           Name := '@ParentId';
           DataType := ftInteger;
           Value := AParentId;
         end;

         with Parameters.AddParameter do
         begin
           Name := '@XMLSessions';
           DataType := ftMemo;
           XmlSessions := TMemoryStream.Create;
           try
             GetXmlStream(ASessions, 'ComputerName', 'UserName', XmlSessions);
             LoadFromStream(XmlSessions, ftMemo);
           finally
             XmlSessions.Free;
           end;
         end;

         with Parameters.AddParameter do
         begin
           Name := '@LoginId';
           DataType := ftInteger;
           Value := 0;
           if (ALogin <> nil) and not ALogin.IsAdmin then
             Value := ALogin.Id;
         end;

         Open;          
         try
           if RecordCount > 0 then
           begin
             First;
             while not Eof do
             begin
               ASums.Add(Fields[0].AsString + '=' + Fields[1].AsString);
               Next;
             end;
           end;
         finally
           Close;
         end;
       end;
     finally
       storedProc.Free;
     end;



    а этот возвращает пустые строки:


    var
     storedProc: TADOStoredProc;
     XmlSessions: TStream;
     i: Integer;
    begin
     storedProc := TADOStoredProc.Create(nil);
     try
       with storedProc do
       begin
         Connection := FConnection;
         ProcedureName := 'we_OrgUnits_GetOrgUnitsSessionSums';

         with Parameters.AddParameter do
         begin
           Name := '@ParentId';
           DataType := ftInteger;
           Value := AParentId;
         end;

         with Parameters.AddParameter do
         begin
           Name := '@XMLSessions';
           DataType := ftMemo;
           XmlSessions := TMemoryStream.Create;
           try
             GetXmlStream(ASessions, 'ComputerName', 'UserName', XmlSessions);
             LoadFromStream(XmlSessions, ftMemo);
           finally
             XmlSessions.Free;
           end;
         end;

         with Parameters.AddParameter do
         begin
           Name := '@LoginId';
           DataType := ftInteger;
           Value := 0;
           if (ALogin <> nil) and not ALogin.IsAdmin then
             Value := ALogin.Id;
         end;

         Open;          
         try
           if RecordCount > 0 then
           begin
             RecordSet.MoveFirst;
             while not RecordSet.Eof do
             begin
               ASums.Add(RecordSet.Fields[0].Value + '=' + RecordSet.Fields[1].Value);
               RecordSet.MoveNext;
             end;
           end;
         finally
           Close;
         end;
       end;
     finally
       storedProc.Free;
     end;

  • istok20 © (10.02.12 12:50) [2]
    поправка: там eof срабатывает и он вообще ничего не возвращает
  • Гость (15.02.12 14:11) [3]
    istok20, попробуйте так:
  • Гость (15.02.12 14:16) [4]
    Чего-то сорвалось...
    В общем можно получить данные и при выполнении компонента TADOCommand. Метод этого компонента Execute возвращает тип _Recordset.
    После чего его можно, например, связать с компонентом TADODataSet следующим образом
    ADODataSet1.RecordSet := ADOCommand1.Execute;

Есть новые Нет новых   [134431   +10][b:0][p:0.003]