JvUIB + Lazarus и старанное поведение с FB 2 Embeded

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Ответить
cav
новенький
Сообщения: 28
Зарегистрирован: 16.11.2006 07:56:03
Откуда: Кемерово

JvUIB + Lazarus и старанное поведение с FB 2 Embeded

Сообщение cav »

Lazarus 0.9.22 SVN:10809
UIB 2.1 декабрьский.
FB 2.0.1.12810

Выполнение следующего кода вызывает ошибку

Код: Выделить всё

   lqwf.Transaction.StartTransaction;
   while not BarPX.EOF do begin
    lqwf.SQL.Clear;
    lqwf.sql.add('insert into bar(barcode,articul)');
    lqwf.sql.add('values ('''+BarPX.fieldbyname('BARCODE').asString+''','''+BarPX.fieldbyname('ARTICUL').asString+''')');
    try
     lqwf.ExecSQL;
    except
     lqwf.Transaction.RollBack;
    end;
    BarPX.Next;
   end;
   lqwf.Transaction.Commit; 

Адрес:
Процедура: gds__start_transaction
в свойствах UIBDataBase.LibraryName установлено fbembed.dll
TaskInfo показывает что приложение ее загружает.
При работе с не встроенным (нормалным сервером FB1.5) все нормально
где я мог ошибится и что можно посмотреть ?
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

строку конекта к БД
cav
новенький
Сообщения: 28
Зарегистрирован: 16.11.2006 07:56:03
Откуда: Кемерово

Сообщение cav »

Конект локальный.
c:\project\base\cin.fdb :)
cav
новенький
Сообщения: 28
Зарегистрирован: 16.11.2006 07:56:03
Откуда: Кемерово

Сообщение cav »

при работающем соеденеи с (полным серверем FB )
и c:\project\base\cin.fdb и localhost:c:\project\base\cin.fdb проходят нормально.
В строке конекта там все правильно :) еще KDV в свое время бил за это (на ibase.ru) просто интересно почему такое странное поведение UIB (по сравнению с теми же FIB+)
Аватара пользователя
Attid
долгожитель
Сообщения: 2589
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E
Контактная информация:

Сообщение Attid »

если конект локальный то хз, отпишись на сайт проиводителя.
Кузнецов Евгений
незнакомец
Сообщения: 2
Зарегистрирован: 02.06.2007 19:04:49

Сообщение Кузнецов Евгений »

Доброго времени суток!

To cav
Мало, Вас KDV бил, мало :) C UIB практически не работал, но увидев Ваш код, не смог не вмешаться. Это кто ж так с транзакциями работает?

Код: Выделить всё

   try 
     lqwf.ExecSQL;
    except
     lqwf.Transaction.RollBack;
    end;


Если ExecSQL, к примеру привела к конфликту обновления, то произойдет откат транзакции, а следующие записи из BarPX будут вставляться в контексте какой? Более того, о том, что произошел откат транзакции и по какой причине Вы не узнаете - в except исключение гасится без выдачи сообщения пользователю. Что на FB 1.5, что на FB 2.0.1 этот код работать корректно не будет. Почитайте http://www.ibase.ru/devinfo/ibx.htm#tran_use - не думаю, что IBX так уж сильно отличается от UIB.
Далее : в данном случае формировать SQL лучше не в цикле, а перед ним, а значения передавать через параметры. В IBX Ваш код выглядел бы примерно следующим образом:

Код: Выделить всё

   
with lqwf,SQL do begin
  Clear;
  Add('insert into bar(barcode,articul)');
  Add('values (:barcode, :articul)');
  Transaction.StartTransaction;
  try
    Prepare;
    BarPX.First;
    while not BarPX.EOF do begin
      ParamByName('barcode').AsString:=BarPX.fieldbyname('BARCODE').asString;
      ParamByName('articul').AsString:=BarPX.fieldbyname('ARTICUL').asString;
      ExecSQL;
      BarPX.Next;
    end;
  except
    Transaction.RollBack;
    raise;
  end;
  Transaction.Commit;
end;

Не составит труда перенести его под UIB.
cav
новенький
Сообщения: 28
Зарегистрирован: 16.11.2006 07:56:03
Откуда: Кемерово

Сообщение cav »

to Кузнецов Евгений
Конечно мало :) Но вопрост то не в том как в приведенном примере , тестовом с выкинутыми обратотками, я работаю с транзакциями, а почему UBI не хочет работать с Embed FB 2
по поводу кода.... вот что было в оригинале : :)

Код: Выделить всё

   try
     lqwf.ExecSQL;
    except
      on e:exception do begin
       lqwf.Transaction.RollBack;
        ShowMessage('Ощибка при операции'+#13+e.Message);
       exit;
      end;
    end;

Код (всего проекта нужен всего пару раз и т.к. выполнять то что получилось буду я то было посчитано что заморачится с обработчиками ошибок и т.п. лишнее.
Про параметры и prepare вкурсе :) в UIB это выглядило что типа того :

Код: Выделить всё

QWF.Params.ByNameAsInteger['DX']:=
[quote][/quote]
Кузнецов Евгений
незнакомец
Сообщения: 2
Зарегистрирован: 02.06.2007 19:04:49

Сообщение Кузнецов Евгений »

Доброго времени суток!

cav писал(а):Но вопрост то не в том как в приведенном примере , тестовом с выкинутыми обратотками, я работаю с транзакциями, а почему UBI не хочет работать с Embed FB 2

Тогда ладно. Я посчитал, что эта ошибка возникает как раз из-за отсутствия активной транзакции в Вашем тестовом примере.
Попробуйте на релизе FB 2.0.1 (сборка 12855).
Ответить