![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Поиск
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';
И больше ничего не надо.