Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Базы данных и репортинг > Update DB set x=y where ???


Автор: Illusion Dolphin 25.8.2005, 03:46
Пишу в 4 ночи, может вопрос тупой по сути, но я ничего не въезжаю.
Долгое время у меня была процедура, пишу упрощённо:
Код

for i:=1 to n do
begin
query.close;
query.sql.text:='update "c:\1.db" set x="'+myvar+'" where ID = '+inttostr(i);
query.ExesSQL;
end;

x - поле типа BLOB Memo.
работала хорошо, но долго. Решил упростить так:
Код

query.close;
query.sql.text:='update "c:\1.db" set x="'+myvar+'" where ((ID = 1) or (ID = 2) or (ID = 3) or (ID = 4) or (ID = 5) or (ID =6) or (ID = 7) or (ID = 8)...)'; //***
query.ExesSQL;
end;

Сначала протестил - вроде пашет, а потом... В итоге n=50, в результате выполнения запроса (***) никаких ошибок не возникает, но х установилось не в 50ти записях, а в 16ти-24х! Причём без какой-то зависимости и не удалось мне понять, сколько же точно записей обновляется. При выполнении процедуры 3 раза (при n=50 у меня в базе) в итоге все поля были обновлены...
Объясните, что это за лажа, можно ли писать так запрос (***) и есть ли выход?

Автор: Alex 26.8.2005, 02:25
Код

query.close;
query.sql.text:='update "c:\1.db" set x="'+myvar+'" where ID >= 1 and ID <= '+inttostr(n);
query.ExesSQL;

Автор: Akina 26.8.2005, 08:46
Код

query.sql.text:='update "c:\1.db" set x="'+myvar+'" where ID between 1 and '+inttostr(n);

Автор: Illusion Dolphin 26.8.2005, 09:59
Alex,
Akina
Спасибо за попытку помочь, но как всегда пришлось помогать самому себе.
Дело в том, что от 1го до N это я для примера дал, в реале это может быть типа "234, 5, 1234, 456, 2467..." - т.е. совсем не связные значения. После долгого тестирования я понял, что обновляются первые 16 значений (если все их отсортировать по возрастанию (может быть потому что у меня ID Autoincrement). В итоге запрос разбивал на N, в каждом из которых устанавливается значение в 16 полях. Вероятно это из-за какого-то ограничения данной БД :/

Автор: kobra 26.8.2005, 13:19
Код

where ID in (...)
а так?

Автор: Illusion Dolphin 26.8.2005, 14:09
Цитата

а так?

А так работает smile. Значит это всё-таки было ограничение на кол-во полей, учавствующих в условии... Сенькс бальшой

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)