Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2006.11.05;
Скачать: CL | DM;

Вниз

ошибка при обращении к Parameters наследника TADOStoredProc   Найти похожие ветки 

 
Arm79 ©   (2006-03-16 11:50) [0]

Здравствуйте.

Создаю наследника от TADOStoredProc. Основная задача - хранить динамический массив со значениями по умолчанию для параметров ХП.

Проблема - при обращении с св-ву Parameters выдается Access Violation (procedure FillParameters)

Объект создан. Parameters.Refresh проходит успешно.
(procedure RefreshParams(const Con: TADOConnection);
 var
   i     : integer;
   r     : boolean;
   spTemp: TADOStoredProc;
begin
 r := True;
 for i := 0 to Con.DataSetCount-1
 do begin
      // в Con могут содержаться как TADOStoredProc,
      // так и TmodADOStoredProc. Тк TmodADOStoredProc
      // - наследник TADOStoredProc, такое приведение
      // типов мне кажется оправданным
   
   spTemp := TADOStoredProc(Con.DataSets[i]);

   if spTemp.Parameters.Refresh
   then begin
     // запись в лог
   end
   else begin
     // запись в лог
     r := False;
   end;
 end;
end;
)

type
 TmodADOStoredProc = class(TADOStoredProc)
 private
   FAccordance : TAccordance;
 public
   destructor Destroy; override;

   procedure FillAccordance(const Accordance: TDataSet);
   procedure FillParameters(const Data: TDataSet);
 end;

// заполнение динамического массива данными
procedure TmodADOStoredProc.FillAccordance(const Accordance: TDataSet);
 var
   i  : integer;
   vT : Variant;
begin
 SetLength(FAccordance, 0);
 if Assigned(Accordance)
 then begin
   if Accordance.Active
   then begin
     SetLength(FAccordance, Accordance.RecordCount);

     Accordance.First;
     i := 0;
     while not Accordance.Eof do
     begin
       with FAccordance[i] do
       begin
         vT := Accordance.FieldValues["proc_name"];
         if VarIsEmpty(vT) or VarIsNull(vT)
         then vT := "";
         ProcName := vT;

         vT := Accordance.FieldValues["param"];
         if VarIsEmpty(vT) or VarIsNull(vT)
         then vT := "";
         Param := vT;

         vT := Accordance.FieldValues["field"];
         if VarIsEmpty(vT) or VarIsNull(vT)
         then vT := "";
         Field := vT;

         vT := Accordance.FieldValues["value"];
         Value    := vT;

         vT := Accordance.FieldValues["work_mode"];
         if VarIsEmpty(vT) or VarIsNull(vT)
         then vT := 0;
         WorkMode := vT;

         vT := Accordance.FieldValues["symbol"];
         if VarIsEmpty(vT) or VarIsNull(vT)
         then vT := "v";
         DataType := GetTypeByChar(string(vT)[1]);
       end;

       Accordance.Next;
       Inc(i);
     end;
   end;
 end;
end;

// присваивание значений по умолчанию и соответствующих данных из датасета парметрам процедуры
procedure TmodADOStoredProc.FillParameters(const Data: TDataSet);
 var
   i    : Integer;
   iPos : Integer;
   vT   : Variant;
begin
 if Data.Active
 then begin
   for i := 0 to Parameters.Count-1  // вот в этой строчке
   do begin
     if Parameters[i].Direction in [pdUnknown, pdInput, pdInputOutput]
     then begin
       iPos := IndexByParam[Parameters[i].Name];
       if iPos >= 0
       then begin
          Parameters[i].Value := AccordanceNode[iPos].Value;

         if AccordanceNode[iPos].WorkMode <= 0
         then begin
           Parameters[i].Value := Data.FieldValues[AccordanceNode[iPos].Field];
         end;
       end;
     end;  
   end;
 end;
end;


 
Arm79 ©   (2006-03-16 14:38) [1]

Вопрос снимается. Ошибка возникала при неправильной работе со списком таких процедур.



Страницы: 1 вся ветка

Текущий архив: 2006.11.05;
Скачать: CL | DM;

Наверх




Память: 0.47 MB
Время: 0.034 c
1-1158916637
MixAnOL
2006-09-22 13:17
2006.11.05
Печать на термопринтере через RS232


2-1161337013
svt
2006-10-20 13:36
2006.11.05
access 2.0


4-1150985614
PRT
2006-06-22 18:13
2006.11.05
Popup в Run - time


3-1157472475
Firefly
2006-09-05 20:07
2006.11.05
MySQL. Размер Data-файла.


2-1161096034
hom
2006-10-17 18:40
2006.11.05
вопрос по Excel