Конференция "Базы" » [ZeosDBO] рекеордсет при select для update [D7, MsAccess]
 
  • 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 потока работают с одной таблицей.
  • sniknik © (08.02.16 10:31) [4]
    > Подключаюсь к бд через 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';
  • sniknik © (09.02.16 14:04) [6]
    > zeos ввиду того что были когда то проблемы с адо.
    а сейчас с zeos их типа нету?
    проблемы не от компонент (если они конечно не "велосипеднонаколеночные"), а от твоего неумения с ними работать.

    >>>коннекта/таблицы курсор серверный
    > не понял этого
    у ado есть несколько вариантов работы/взаимодействия с движком базы, от того как именно ты с ним работаешь могут зависеть блокировки. к примеру - монопольный режим/однопроходный курсор/асинхронный режим/....

    > Алиас конекта прописывал выше:
    тоже выше писал - сомневаешься - оставь по умолчанию.

    при том, по умолчанию от "чистого ado", zeos может их "коверкать" под свои представления.
  • sniknik © (09.02.16 14:09) [7]
    > 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]
    Удалено модератором
 
Конференция "Базы" » [ZeosDBO] рекеордсет при select для update [D7, MsAccess]
Есть новые Нет новых   [134427   +34][b:0][p:0.002]