Delphi 5 и передача параметров в ADOQuery
От: Аноним  
Дата: 22.11.06 06:27
Оценка:
В общем довелось мне тут ковыряться в чужом коде на предмет исправления и дополнения. Программа — обычная облочка для базы данных клиентов, написана на Делфи 5, для открытия формы соответствующего клиента использует параметризованные запросы.

Для задания параметра используется вот такой вот несложный код:

DataModule1.ADOQueryDeliver.Close;
DataModule1.ADOQueryDeliver.Parameters.ParamByName('id_cl').Value:=id_client;
//DataModule1.ADOQueryDeliver.Parameters.ParamByName('id_cl').Value:=id_client;
DataModule1.ADOQueryDeliver.Open;


Так вот. При попытке открыть форму выскакивает глубокомысленное сообщение вида: "Either BOF or EOF is True, or the current record has been deleted. Requested operation requires a current record".

Если параметр вышеописанным способом не передавать — форма открывается, пустая конечно. Так что проблема точно в этом.

Заменяю вторую строчку в коде на закомментированную.
Запускаю адский делфевский дебуггер, пишу три вотча.

1. DataModule1.ADOQueryDeliver.Parameters.Items[0].Value
2. DataModule1.ADOQueryDeliver.Parameters.ParamByName(':id_cl').Value
3. DataModule1.AdoQueryDeliver.Parameters.ParamValues[':id_cl']

В ответ на первый пишет все как надо, нужное значение параметра.
На второй: "Delphi Exception EDatabaseError at $4DFF985".
А на третий — вообще "Function to be called, TParameters.GetParamValue, was eliminated by linker".

И теперь я уже ничего не понимаю.
Кстати, при попытке открытия датасета через среду, открывает он без проблем, а вот при закрыти выдает ту же ошибку про BOF и EOF.

Самое смешное, что программа эта уже пару лет замечательно работает в некой организации. Тот человек, который ее писал, давно уже уволился, и оставил за собой исходники. Вот при попытке эти самые исходники скомпилить мне этот "результат" и выдается. То ли исходники не те, то ли я на голову болен, то ли это божий промысел...


У кого-нибудь мысли есть?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.