Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 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
1-1171303374
tequilla4white
2007-02-12 21:02
2007.04.08
IXMLNode.Count возвращает неверное значение


3-1167918930
_ozzy_
2007-01-04 16:55
2007.04.08
Как упаковать файл Paradox?


2-1174373951
БЫЛ
2007-03-20 09:59
2007.04.08
string в var Buf


2-1173887407
kyn66
2007-03-14 18:50
2007.04.08
Работа со сканером штрихкода


15-1173770951
Java
2007-03-13 10:29
2007.04.08
Проблема с SimpleDateFormat(Java)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский