Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];
Вниз
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.052 c