-
vegarulez (08.02.16 02:24) [0]привет всем мастерам!
Подключаюсь к бд через ZeosDBO делаю запрос select первых 20 записей, потом разибраю каждую запись, работаю с ней и данные работы сохраняю обратно через update.
Возникает вопрос как это правильно организовать?
Судя по всему, я должен сделать запрос и поместить данные селекта в рекордсет \ или датасет и по нему уже делать выборку while, потому как пока открыт zquery с селектом записей - update записи не проходит ввиду блокировки- соотвественно при update получаю ошибку:Обновление невозможно; установлена блокировка:5003218
- Эй, ну хватит уже писанины, поняли уже давно о чем ты, код ф студию [доносится с задних рядов].
- Ок, ну как то так:
var
myzquery, myzquery_updt: TZQuery;
state:string;
values: array [0..2] of string;
begin
try
try
myzquery.Sql.Text :=
'Select top 20 `id`,`state`,`name` from `foo` WHERE `state`>0 order by `id` asc';
myzquery.open;
while ((not myzquery.Eof) and (not terminated)) do
begin
for j := 0 to myzquery.FieldCount - 1 do
values[j]:=myzquery.Fields[j].AsString;
// workaem с полученными данными формируем переменную state для обновления в текущей записи
// и обновляем
myzquery_updt.Sql.Text := 'Update `foo` set `state`=' + state + ' where `id`=' + values[0] + '';';
myzquery_updt.ExecSQL();
myzquery.Next;
end;
finally
// фришим переменные
end;
except on E: Exception do
begin
// месага об ошибке
end;
end;
end;
Как сделать и работать с рекордсетом или датасетом - в этой области пробел - киньте ссылкой или примером где это почитать, посмотреть.
з.ы. чем отличается рекордсет и датасет?? на слух вроде и то и другое содержит записи \ данные?? Вообщем не знаю эту тему. поделитесь опытом.
Заранее спасибо -
vegarulez (08.02.16 02:37) [1]и забыл указать подключение к бд:myzconection.Database :=
'Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Jet OLEDB:Database Password=\"mypass\";Data Source=.\mybd.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False';
myzconection.Protocol := 'ado';
может просто в самом подключении в алиасе прописал блокировку? -
vegarulez (08.02.16 03:09) [2]Открыта в обоих потоках на редактирование и запись.
-
vegarulez (08.02.16 03:11) [3]в смысле 2 потока работают с одной таблицей.
-
> Подключаюсь к бд через ZeosDBO
не мала баба клопоту - купила порося.
вот смысл добавлять к ado еще одну прослойку? типа просто ado "тормозит" в твоих руках, добавлю как еще одно звено, и будет быстрее... так что ли?
> - Ок, ну как то так:
"как то так" это синоним "через Ж..."? зачем тянуть данные на клиента если они просто из таблицы в таблицу переливаются? почему это не одним запросом? и нафига тут поток? (такое обновление по нормальному даже для миллиона записей меньше секунды выполняться, а 20 записей так вообще, даже криво трудно сделать медленно, чтоб поток стал нужен...)
> может просто в самом подключении в алиасе прописал блокировку?
сомневаешься? оставь по умолчанию, не прописывай.
> в смысле 2 потока работают с одной таблицей.
в каком режиме Zeos открывает таблицы? у коннекта/таблицы курсор серверный (вообще тип расположение от дефаултного-ado, отличается )? сам коннект (у компонента) монопольное открытие не стоит? коннект у тебя один на оба потока? и т.д. -
vegarulez (09.02.16 13:47) [5]потоки работают с данными беря их с локальной бд, отправляя по сети, обрабатывая ответы, и занося назад в бд результат обработки. потоки нужны.
zeos ввиду того что были когда то проблемы с адо.
zeos делает запрос myzquery.open; - далее поток работает с полученными данными, и потом обновляет каждую запись в зависимости от полученных ответов касательно этой записи.
>>коннекта/таблицы курсор серверный
не понял этого
конекты соотвественно разные в каждом потоке создаются динамически при работе потоков.
Алиас конекта прописывал выше:
'Provider=Microsoft.Jet.OLEDB.4.0; User ID=Admin; Jet OLEDB:Database Password="mypass";Data Source=.\mybd.mdb;Mode=ReadWrite|Share Deny None;Persist Security Info=False'; -
> zeos ввиду того что были когда то проблемы с адо.
а сейчас с zeos их типа нету?
проблемы не от компонент (если они конечно не "велосипеднонаколеночные"), а от твоего неумения с ними работать.
>>>коннекта/таблицы курсор серверный
> не понял этого
у ado есть несколько вариантов работы/взаимодействия с движком базы, от того как именно ты с ним работаешь могут зависеть блокировки. к примеру - монопольный режим/однопроходный курсор/асинхронный режим/....
> Алиас конекта прописывал выше:
тоже выше писал - сомневаешься - оставь по умолчанию.
при том, по умолчанию от "чистого ado", zeos может их "коверкать" под свои представления. -
> zeos делает запрос myzquery.open; - далее поток работает с полученными данными, и потом обновляет каждую запись в зависимости от полученных ответов касательно этой записи.
после open-а коннект бы логичнее закрыть, и открывать заново перед записью... раз уж "работает с полученными данными" по сети (выше), т.е. относительно долго. не выполняется правило коротких транзакций. а количество коннектов у jet-а ограничено по умолчанию (то ли 3 то ли 5 и не больше 10... ну вроде бы неохота в справку лезть). -
имя(21.04.16 14:53) [8]Удалено модератором -
имя(21.04.16 15:01) [9]Удалено модератором -
имя(21.04.16 15:06) [10]Удалено модератором -
имя(21.04.16 15:11) [11]Удалено модератором -
имя(21.04.16 15:32) [12]Удалено модератором