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

Вниз

TADOCommand   Найти похожие ветки 

 
Wood   (2007-03-14 09:39) [0]

Приветствую, мастера!
Изучаю ADO-компоненты в связке Microsoft.Jet.OLEDB.4.0 база Access (mdb). Не обзывайте и не гоните, а помогите пожалуйста
Проблема такова:
ADOCommand приконнектен ч/з ADOConnect. В ADOCommand в дизайнтайме добавлено 2 параметра с настройками по умолчанию.
Имеются 2 функции проверки совпадений значений поля таблицы, одна при создании новой записи, другая при редактировании. Соответственно...
1:
function TfMainExp.frecnew(s, tabl, fiel: string): boolean;
begin
result:=False;
try
  With DM_exp.ADOCommand1 do
   begin
    Parameters.ParamByName("fnam").Value :=s;
    CommandText:="select * from "+tabl+" where "+fiel+" = :fnam";
    if Execute.RecordCount<>0 then result:=True;
   end;
 except
  result:=True;
 end;
end;


*****************
2:
function TfMainExp.freced(s,s1, tabl, fiel: string): boolean;
begin
result:=False;
try
  With DM_exp.ADOCommand1 do
   begin
    Parameters.ParamByName("fnam").Value :=s;
    Parameters.ParamByName("f2nam").Value :=s1;
    CommandText:="select * from "+tabl+" where "+fiel+" = :fnam and "+fiel+
    " <> :f2nam";
    if Execute.RecordCount<>0 then result:=True;
   end;
 except
  result:=True;
 end;
end;


Боюсь, от незнания или не понимания работы компонента TADOCommand, возникает ошибка в проге.
Если сначала использовать 2-ю функцию с повтором значения S, то все нормально.
Если вперед использовать 1-ю функцию с повтором значения S, то функция работает нормально, НО, при использовании после 1-й сразу 2-й функции, происходит ошибка "не найден параметр "f2nam" ".
Подскажите, где что может быть не правильно.
Спасибо.


 
Savek   (2007-03-14 09:53) [1]

Сначала
 CommandText:="select * from "+tabl+" where "+fiel+" = :fnam and "+fiel+
   " <> :f2nam";

и толь ко потом
Parameters.ParamByName("fnam").Value :=s;
   Parameters.ParamByName("f2nam").Value :=s1;

а ты пытаешься присвоить значения параметрам, которые еще не созданы


 
Wood   (2007-03-14 09:58) [2]


> Savek   (14.03.07 09:53) [1]

Почему, тогда не "ругается" при первом вызове 2 функции и при первом вызове 1-й функции (в 1-й функ. не ругается ни разу)


 
Wood   (2007-03-14 10:05) [3]

Благодарю, Savek, помогло..

> а ты пытаешься присвоить значения параметрам, которые еще
> не созданы

это как, вроде в дизайне параметры были созданы заранее?


 
Плохиш ©   (2007-03-14 11:27) [4]


> Wood   (14.03.07 10:05) [3]
> Благодарю, Savek, помогло..
>
> > а ты пытаешься присвоить значения параметрам, которые
> еще
> > не созданы
>
> это как, вроде в дизайне параметры были созданы заранее?
>

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


 
Wood   (2007-03-14 11:46) [5]


> Плохиш ©   (14.03.07 11:27) [4]

На счет "подробненько", не уверен, переводил как мог, жаль примеров нет..

> а так же приведены волшебные слова...

это какие такие волшебные?


 
Плохиш ©   (2007-03-14 11:48) [6]

Prepared


 
sniknik ©   (2007-03-14 11:53) [7]

> это как, вроде в дизайне параметры были созданы заранее?
ну, чтото ты видать в десигне в компонент внес... какойто из запросов, вот от него параметры и создались.

hint
у тебя в функция проверяет просто на присутствие значения, значит выборка/полный обзор таблицы запросом не нужна.
поставь в запрос тогда вместо * например top 1 0 (прекратить выборку после первой найденной, и ненужное значение вместо выборки/формирования записей рекордсета)

и потом except тебе не нужен, мало того скрывает ошибку если что, так еще какойто дисбаланс в возвращаемый результат вносит. (т.е. если ошибка, то там чтото есть? оригинально ;о))
вообще ошибки надо анализировать... а не скрывать, и имхо не в этой функции а уровнем выше (поэтому здесь except и не нужен).

в общем я бы написал так (принцип. по первому примеру)
function TfMainExp.frecnew(const s, tabl, fiel: string): boolean;
begin
 With DM_exp.ADOCommand1 do  begin
    CommandText:= "select top 1 0 from "+tabl+" where "+fiel+"=:fnam";
    Parameters[0].Value:= s; //и так понятно что за параметр
    result:= Execute.RecordCount <> 0;
 end;
end;


 
Wood   (2007-03-14 13:03) [8]

Спасибо большое всем!

> sniknik ©   (14.03.07 11:53) [7]
>ну, чтото ты видать в десигне в компонент внес... какойто из запросов, вот от него параметры и создались.

В ADOCommand1? Нет, кроме ADOConnect и 2-х параметров ничего не указывал. Может тогда, когда вызвал 1-й раз запрос (ф1)? Я понимаю, сразу бы ругнулось..

> в общем я бы написал так (принцип. по первому примеру)

красиво...


 
Wood   (2007-03-14 15:38) [9]


> sniknik ©   (14.03.07 11:53) [7]


> и потом except тебе не нужен, мало того скрывает ошибку
> если что, так еще какойто дисбаланс в возвращаемый результат
> вносит.

Я не собирался скрывать ошибку, никогда так не делал, except "голый", потому что, это только заготовка функции была из копи/паста, собирался вставить сообщение об ошибке позже. А вообще, если в теле функции возникнет ошибка до проверки результа, то в твоем примере, ув. sniknik ©, как я понял, результ будет фальш. Т.е., пользователь увидит, допустим, сообщение об ошибке (как я увидел свою ошибку), но функция вернет, что записей не найдено и возможно, произойдет какое-то действие.
Как быть, подскажи, плз!


 
sniknik ©   (2007-03-14 20:05) [10]

> то в твоем примере, ув. sniknik ©, как я понял, результ будет фальш.
нет в моем примере будет исключение которое должно обрабатываться там где функция вызвана, а дальнейшая работа при неопределенном значении прекращена... и так оно и будет, по логике.
try
 ....
 //чтото делается
 if frecnew(....) //вызов функции
   then .... //а то что ниже, при возникновении исключения в функции уже не сработает
   else ....  //и это тоже, независимо от предполагаемого результата
 ....          //не говоря об этом
except
 on E: Except do ErrorProccess...  //при исключении прыгнет сюда, где ты его и обработаешь
end;


а вот если ты его спрячешь как в 0, да еще и выдашь true то дальше пойдет обработка как будто обращение к таблице не только не дало ошибки, а еще и вернуло как будто в ней есть записи... ну разве это хорошо?


 
Wood   (2007-03-15 04:33) [11]


> sniknik ©   (14.03.07 20:05) [10]

да, все верно, понял! Спасибо, sniknik ©

> ну разве это хорошо?

Нет, конечно!



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

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

Наверх




Память: 0.5 MB
Время: 0.028 c
3-1168595092
AMS
2007-01-12 12:44
2007.04.08
Сообщение об ошибке в fastreport3.0


15-1173873526
nimp
2007-03-14 14:58
2007.04.08
Ошибка в дельфях


15-1173962896
roman_ln
2007-03-15 15:48
2007.04.08
Закрыть форму в Visual Basic


6-1161325036
YurkaT
2006-10-20 10:17
2007.04.08
IdHTTPServer - проблемма с выполнением JS


2-1174207099
Лебедев
2007-03-18 11:38
2007.04.08
График