![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
проверка наличия IDs в таблице
Scot Storch © (2010-06-28 14:32:00)имеется таблица "A" с полем "ID". Нужно написать процедуру которая принимает в качестве входного параметра строку IDшников (символ-разделитель запятая) и проверяет имеет ли таблица "A" поле "ID" со значением ID из строки. Сделал так. Пока что сделал так (хреново как мне кажется):
procedure chk_IDs(const IDs: string);
var
all, I, ID: Integer;
cmp_query: TQuery;
sSQLFmt: string;
str_lst_IDs: TStrings;
begin
str_lst_IDs := TStringList.Create;
try
str_lst_IDs.DelimitedText := IDs;
cmp_query := TQuery.Create(nil);
try
cmp_query.DatabaseName := DB_NAME;
cmp_query.SessionName := SSN_NAME;
all := str_lst_IDs.Count;
for I := 0 to all - 1 do
begin
ID := StrToInt(str_lst_IDs[I]);
cmp_query.SQL.Text := Format('SELECT * FROM items WHERE item_id = %d',
[ID]);
cmp_query.Open;
if cmp_query.RowsAffected = 0 then
raise Exception.CreateRes(@SCN_NOT_EXISTS, [ID]);
end;
finally
cmp_query.Free;
end;
finally
str_lst_IDs.Free;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
chk_IDs('11,24,37,59,61,98');
end;
Получается, чтобы проверить каждый из ID нужно делать запрос. Дайте советы по оптимизации.
Sergey13 (2010-06-28 14:50:00) [1]> [3] Scot Storch (28.06.10 14:41)
> если посылать все сразу (IN), то нельзя отследить какой
> из них ошибочный
сравни результат с входной строкой.
Scot Storch (2010-06-28 14:41:00) [2]проблема в том, что нужно генерить exception для несуществующего ID. если посылать все сразу (IN), то нельзя отследить какой из них ошибочный.
Sergey13 (2010-06-28 14:37:00) [3]Если на входе строка не шибко здоровая, то можно так попробовать
select id from table where id in (твоя строка из идшников)
И. Павел (2010-06-28 14:36:00) [4]Можно преобразовать 11,24,... в id=11 or id=24 и запросить сразу все id из таблицы. Если recordcound<количества id, то какой-то id не нашли (это если id уникален для каждой строки).