Page 1 of 1

ZQuery.Delete removes a record in another table

Posted: 13.08.2010, 07:09
by vinni
Hi!

The situation. There is a table (in SQLite3), named Table1. And a query ZQuery1. Do the following:

[php]ZQuery1.SQL.Text := 'select * from table1';
ZQuery1.Open;
ZQuery1.Delete;
[/php]

So, the record is removes from both ZQuery1 and table1 (located in database).

Is it normal? How can I to delete a record from ZQuery1 only?

Thanks!

Posted: 13.08.2010, 17:49
by mrLion
вообще-то нормально. так и должно быть. :) Причем, судя по тексту удаляется та запись на которой стоит указатель. Учитывая, что запрос не содержит директиву order by, то при каждом обращении может быть произвольная запись. Может быть, если ты поставишь свойство ReadOnly Query (или что-то типа этого) то удаляться не будет. Ниоткуда. Если же тебе нужны только некоторые записи, то используй

... where field=.....

А зачем такая конструкция?

Posted: 16.08.2010, 06:10
by vinni
У меня выбираются записи из Table1 и встают в стек на некую обработку. Обработка происходит в отдельном потоке. Так вот в качестве стека я хотел использовать ZQuery1, т.к. это самый удобный вариант. После обработки одной записи из стека она должна быть удалена - соответственно, она удалялась и из основной таблицы Table1.
Теперь сделал по-другому. Создал еще одну таблицу, в которую запросом выбираются записи из Table1. Это и есть стек. После обработки текущая запись удаляется из этой таблицы через тот же ZQuery. При этом записи в Table1 остаются нетронутыми.

Posted: 16.08.2010, 19:55
by mrLion
ZQuery.Open;
ZQuery.FetchAll;
ZQuery.First;
For I:=0 to I<=ZQuery.RecordCount do
Begin
... обработка...
ZQuery.Next;
End;

в чем проблема то?
Никакого удаления, просто перебор всех выбранных и подлежащих обработке записей. Или я что-то недопонял?!

Posted: 17.08.2010, 05:50
by vinni
Ну я же говорю: в отдельном потоке. Чтобы не хранить индекс обрабатываемой записи - просто берем каждый раз первую. А когда станет RecordCount = 0, то Thread.Terminate.

Кстати, а FetchAll зачем?

Posted: 17.08.2010, 20:05
by mrLion
Зачем, блин, хранить индекс???? И такой подход - просто издевательство. Представь, что таблица хранить 1000 записей. Пе6рвый запрос выбирает 1000, второй 999, 998... ну и т.д. Нагрузка на сервер и сеть - чумовая. FetchAll - принудительно выбирает все записи по условию запроса. А алгоритм последовательно обрабатывает выбранные записи. Потом закрываешь запрос и все, забыл про него.
И причем здесь отдельный поток? БД многозадачная.... Ой... Я работаю с PostgreSQL, может в твоем случае это не так. Я вообще с этими огрызками типа MySQL не имел дела. Задачи не те.

P.S. Ну как вариант попробуй ZTable....

Posted: 18.08.2010, 06:09
by vinni
Ладно, может быть я не так доходчиво объясняю... Да и смысла нет. А в таблице врядли будет больше 100 записей. По крайней мере сейчас выбор всех записей работатет моментально.
В любом случае, спасибо за совет! :-)
Тему можно закрывать.

Posted: 30.08.2010, 00:55
by mdaems
vinni,

Has your problem been solved? Please use english summaries when using other languages on the forum.

Mark