все что связано с моей работой
Главная » Програмирование » Ограничения SQLite.

Ограничения SQLite.

Давеча столкнулся с проблемой: при переносе данных программа не хотела выполнять скрипт, выдавая ошибку: ‘cannot start transaction within a transaction’. Самое интересное было то, вызов этой же функции из другого места отрабатывал на ура.

Как оказалось SQLite не умеет делать несколько транзакций, т.е. нельзя одну транзакцию на чтение, другую, хотя бы одну, на обновление – транзакция открытая только одна! Хотя в этом есть свой плюс – реализуется главное правило: время жизни транзакции должно быть минимальным.

С другой стороны это создает немного гемороя, теперь простой код обработки данных надо переписывать:

  if CreateDataSet(sql,D) then try
    SQ:=TStringList.Create;
    while not D.EOF do begin
      y:=D.FieldByName('Y').AsInteger;
      m:=D.FieldByName('M').AsInteger;
      f:=D.FieldByName('F').AsInteger;
      t:=D.FieldByName('T').AsInteger;
      DebugLn(format('Year=%d, Month=%d, Terr_id=%d, Form_id=%d',[y,m,t,f]));
      sql:='insert into UR_Temp(Y,M,form_id,territory_id,ssoot_id) '+
           'select '+IntToStr(y)+','+IntToStr(m)+','+IntToStr(f)+','+IntToStr(t)+
           ',id from ssoot where form_id='+IntToStr(f)+' and not id in (select '+
           'ssoot_id from UR_temp where Y='+IntToStr(y)+' and M='+IntToStr(m)+
           ' and form_id='+IntToStr(f)+' and territory_id='+IntToStr(t)+')';
      DebugLn(sql);
      SQ.Append(sql);
      D.Next;
    end;
    DebugLn('Script lines=',IntToStr(SQ.Count));
    Result:=ExecuteScript(SQ);
  finally
    SQ.Free;
    FreeDataSet(D);
  end;

Теперь придется отдельно проводить чтение засовывать его во временный массив, закрывать транзакцию, а потом уже обрабатывать. Или как вариант посмотреть на использование TMemDataSet или TBufDataSet смотря кто из них может делать Borrow структуре и данным…

Комментариев нет

No comments yet.

RSS feed for comments on this post.

Sorry, the comment form is closed at this time.