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

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

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

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

Сообщение cav » 30.05.2007 10:44:40

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) все нормально
где я мог ошибится и что можно посмотреть ?
cav
новенький
 
Сообщения: 28
Зарегистрирован: 16.11.2006 08:56:03
Откуда: Кемерово

Сообщение Attid » 30.05.2007 21:04:09

строку конекта к БД
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение cav » 31.05.2007 05:35:05

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

Сообщение cav » 31.05.2007 05:38:33

при работающем соеденеи с (полным серверем FB )
и c:\project\base\cin.fdb и localhost:c:\project\base\cin.fdb проходят нормально.
В строке конекта там все правильно :) еще KDV в свое время бил за это (на ibase.ru) просто интересно почему такое странное поведение UIB (по сравнению с теми же FIB+)
cav
новенький
 
Сообщения: 28
Зарегистрирован: 16.11.2006 08:56:03
Откуда: Кемерово

Сообщение Attid » 31.05.2007 21:46:20

если конект локальный то хз, отпишись на сайт проиводителя.
Аватара пользователя
Attid
долгожитель
 
Сообщения: 2585
Зарегистрирован: 27.10.2006 17:29:15
Откуда: 44°32′23.63″N 41°2′25.2″E

Сообщение Кузнецов Евгений » 02.06.2007 19:38:25

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

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.
Кузнецов Евгений
незнакомец
 
Сообщения: 2
Зарегистрирован: 02.06.2007 19:04:49

Сообщение cav » 03.06.2007 16:39:45

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]
cav
новенький
 
Сообщения: 28
Зарегистрирован: 16.11.2006 08:56:03
Откуда: Кемерово

Сообщение Кузнецов Евгений » 03.06.2007 20:02:38

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

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

Тогда ладно. Я посчитал, что эта ошибка возникает как раз из-за отсутствия активной транзакции в Вашем тестовом примере.
Попробуйте на релизе FB 2.0.1 (сборка 12855).
Кузнецов Евгений
незнакомец
 
Сообщения: 2
Зарегистрирован: 02.06.2007 19:04:49


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 105

Рейтинг@Mail.ru