Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Поиск


Страницы:   1 2

Nameziz ©   (2008-09-08 12:14:00) 

Помогите с реализацией поиска. Задача: написать функцию которая бы по имени поля и его значению искала записи (использовать компонент Query + использовать параметры) и в качестве результата возвращала количество найденных записей. Вот что у меня получилось:

function Tdatamodule_Connection.FindByField(const FieldName,
 FieldValue: string): Integer;
begin
 Result := -1;
 if ConnectionStatus = csConnected then
 begin
   cmp_Query_.Close;
   cmp_Query_.SQL.Text := 'SELECT * FROM ITEM WHERE ' + FieldName + ' = :FieldValue';
   if not cmp_Query_.Prepared then
     cmp_Query_.Prepare;
  // здесь не получается сделать разделение для тестовых и числовых полей.
     cmp_Query_.ParamByName('FieldValue').AsInteger := StrToInt(FieldValue);
 {  else
     cmp_Query_.ParamByName('FieldValue').AsString := FieldValue; }
   cmp_Query_.ExecSQL;
   Result := cmp_Query_.RowsAffected;
 end;
 FSelByKey := False;
end;


Anatoly Podgoretsky   (2008-09-08 15:08:00) [1]

И с проверкой if Active then close


Palladin   (2008-09-08 15:06:00) [2]


> Другой человек посмотрит и подумает, что Close нужно обязательно
> явно писать.

И правильно сделает если примет за непреложную истину. Взял - отдай. Позже набравшись опыта узнает, что можно и неможно, но писать не перестанет, бо дисциплинирован. И тоже правильно сделает.


Германн   (2008-09-08 15:04:00) [3]


> Close надо писать перед Open

Сразу после Create! А то мало ли...


clickmaker   (2008-09-08 14:56:00) [4]

Close надо писать перед Open
а то мало ли...


jack128_   (2008-09-08 14:55:00) [5]


> но мы, хорошие дисциплинированные кодеры, всегда пишем,
> даже в таких ситуациях, а то малоли... :)

кстати зря.  Другой человек посмотрит и подумает, что Close нужно обязательно явно писать. и потому будет громоздить его куда попало.


Palladin   (2008-09-08 14:30:00) [6]

ну можно конечно :) но мы, хорошие дисциплинированные кодеры, всегда пишем, даже в таких ситуациях, а то малоли... :) потом искать бродить по коду не хотим :)


Юрий Зотов   (2008-09-08 14:23:00) [7]

> Palladin ©   (08.09.08 13:33) [13]

А я нашел плюшку, а я нашел плюшку, а я буквоед, а я буквоед, Close можно не писать, Close можно не писать...

:o)


Sergey13   (2008-09-08 13:33:00) [8]

> [0] Nameziz   (08.09.08 12:14)
> + использовать параметры

В данном случае они будут бесполезны и только мешать.


Palladin   (2008-09-08 13:33:00) [9]

Function GetCount(Const fn:String; Const fv:Variant):Integer;
Var
 q:TADOQuery;
Begin
 q:=TADOQuery.Create(Nil);
 Try
  q.ConnectionString:=<строка подключения>; или q.Connection:=<объект соединения>;
  q.sql.text:='select count(*) from ITEM where '+fn+'=:PFV';
  q.Parameters.ParamByName('PFV').value:=fv;
  q.Open;
  Result:=q.Fields[0].AsInteger;
  q.Close;
 Finally
  q.Free;
 End;
End;


Nameziz   (2008-09-08 13:30:00) [10]

FieldValue задается вручную. Может быть текстовое значение либо числовое.


turbouser   (2008-09-08 13:25:00) [11]

А чему равно FieldValue ?


Nameziz   (2008-09-08 13:21:00) [12]

И с Open то же самое


Palladin   (2008-09-08 12:39:00) [13]

стоп! какой ExecSQL? чего творишь то :)
у тебя запрос на выборку, Open надо делать.


Ega23   (2008-09-08 12:38:00) [14]


> ExecSQL


читай разницу TQuery.ExecSQL и TQuery.Open


Palladin   (2008-09-08 12:38:00) [15]

может имя поля неверно задано?


Nameziz   (2008-09-08 12:36:00) [16]

ExecSQL


Palladin   (2008-09-08 12:34:00) [17]

а кто именно ошибку выдает?


Nameziz   (2008-09-08 12:28:00) [18]


 cmp_Query_.ParamByName('FieldValue').Value:=FieldValue;

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


clickmaker   (2008-09-08 12:18:00) [19]

> не получается сделать разделение для тестовых и числовых
> полей.

FieldValue: Variant


Юрий Зотов   (2008-09-08 12:16:00) [20]

SELECT COUNT(*)FROM ITEM WHERE ' + FieldName + ' = :FieldValue';

И больше ничего не надо.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо