Форум: "Компоненты";
Текущий архив: 2006.11.05;
Скачать: [xml.tar.bz2];
Внизошибка при обращении к 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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.052 c