Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
ВнизСамопроизвольное? изменение переданных параметров Найти похожие ветки
← →
perov (2002-07-15 08:45) [0]Имеется такой участок кода
procedure PlChangeSQL(var AQuery: TOraQuery; ANewSQL: string; const par: array of const);
var
i: Integer;
begin
with AQuery do begin
if Prepared then UnPrepare;
if Active then Close;
SQL.Clear;
SQL.Add(ANewSQL);
до строкиSQL.Clear
значение par[1].vAnsiString, то что действительно передавалось.
После выполненияSQL.Clear
меняется на случайное.
Значение par[0].vAnsiString не меняется.
Что здесь неправильного?
← →
yozhik (2002-07-15 10:24) [1]возможно в строке ANewSQL нет второго параметра, поэтому он и меняется на случайное значение
← →
Anatoly Podgoretsky (2002-07-15 10:29) [2]Это намек, что бы ты привел содержимое ANewSQL и par
← →
perov (2002-07-15 10:29) [3]par содержит пары элементов - имя, значение
и на данном участке кода par и sql никаким образом не связаны да и не могут иметь общих точек соприкосновения...
есть в par[1] будет Integer то все нормально.
тут дело в чем-то другом....
← →
jonik pegas (2002-07-15 10:30) [4]А ты чего ожидал после Clear-a?. Он сбрасывает свои параметры после изменения SQl запроса. Присвой значения параметра после.
← →
Desdechado (2002-07-15 10:38) [5]естественно. после Clear очищается список параметров. он же потом генерируется заново при появлении SQL.
← →
perov (2002-07-15 10:43) [6]Clear очищает текст запроса, как он может повлиять на другие переменные?????
par - это массив параметров, а не свойство params
и как свойство SQL может что-то знать об окружающем его мире за пределами объекта, который это свойство содержит?
par[1].vansistring содержит указатель на строку, которая формируется динамически , причем anewsql ничто об этом не знает, но создается впечатление, что par[1].vansistring ссылается на область памяти, занятой AQuery.SQL
вызов происходит так
PlChangeSQL(qry999, sql, par);
par формируется следующим образом:
...
AddElementOpenArray(["nam", edtFAM.Text + "%"], par);
...
где
procedure AddElementOpenArray(args: array of const; var Res: TArrayofConst);
var
i, j: Integer;
begin
i := High(res) + 1;
SetLength(Res, High(Res)+ 1 + High(Args) + 1);
for j := 0 to High(Args) do begin
Res[i] := Args[j];
Inc(i);
end;
end;
← →
sniknik (2002-07-15 13:06) [7]Clear очищает текст запроса, как он может повлиять на другие переменные?????
посмотри как установлено свойство ParamCheck, если true то при любом изменении текста запроса будут переопределятся параметры.
← →
perov (2002-07-15 13:22) [8]Параметры запроса хранятся в свойстве param.
При вызове метода Clear "меняется" содержимое par[1].vAnsiString.
par описан как array of const и к свойтсву params типа TParams не имеет никакого отношения.
← →
Vorobyev S (2002-07-15 15:17) [9]Возможно твоя проблема связана с динамическим выделением памяти... Трудно сказать не видя кода...
Проверь все указатели и как выделяется память для объектов (в том числе и массивов) с помощью New() или Object.Create() или же Malloc, SetLength() и т.п.
У меня была похожая проблема, никак не мог понять как изменение данных в одних объектах влияет на другие переменные..
Оказалось, что для переменных (использовались указатели) неправильно выделялась память, в итоге области памяти перекрывались..
Думаю все, что написал, понятно :-)
← →
perov (2002-07-16 05:28) [10]to Vorobyev S
Правильно :)
to all
array of const всю информацию (кроме целых чисел и символа) хранит в виде указателей. и между моментов формирования array of const (он формируется динамически) и моментом его использования, объекты, на которые он ссылается уже могут не существовать (что и было в моем случае), поэтому вызов SQL.Clear мог перераспределить память, колторуу ранее занимали объекты, на которые ссылается array of const
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.08.05;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.005 c