заморочки с FibPlus и Blob

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
yamakasi
Сообщения: 2
Зарегистрирован: 20 мар 2008, 13:51

заморочки с FibPlus и Blob

Сообщение yamakasi » 20 мар 2008, 15:00

Здравствуйте! Помогите пожалуйста разобраться со следующей проблемой:

Исходные данные:

1. среда разработки: Borland c++ 6
2. версия fibplus: 6.5
3. база: firebird 2.0...
4. таблица в бд со след полями:
a. id типа integer ( первичный ключ - автоинкремент)
b. name типа Varchar(40) ( кодировка WIN1251)
c. timeCreated типа TimeStamp ( значение по умолчанию - NOW)
d. descr типа Blob ( SUB_TYPE 1 SEGMENT SIZE 400 значение по умолчанию - NULL)

5. Исполизуемые компоненты:
1. FibPlus: TpFIBDataBase, TpFIBTransaction (2шт - чтение и запись), TpFIBDataSet
2. WIN32: TRichEdit

6. SQL запросы в DataSet:
a. Insert
INSERT INTO TYPE_CONV(
NAME,
TIMECREATED,
DESCR
)
VALUES(
:NAME,
:TIMECREATED,
:DESCR
)


b. Update
UPDATE TYPE_CONV
SET
NAME = :NAME,
TIMECREATED = :TIMECREATED,
DESCR = :DESCR
WHERE TYPE_ID = :OLD_TYPE_ID


c. Refresh
SELECT
NAME,
TIMECREATED,
DESCR
FROM
TYPE_CONV
WHERE
TYPE_CONV.TYPE_ID = :OLD_TYPE_ID


7. Это тестовая программа

Описание проблемы:
1. При выполнении такого кода все проходит нормально:
DataSet1->Insert();
DataSet1->FieldByName("NAME")->AsString = "Пробник1";
DataSet1->Post();

Т.е. в таблицу данные записываются.

2. Однако, при выполнении такого кода - вылетает ошибка, но данные в таблицу записываются (name - нормально , а blob какой то бред):
DataSet1->Insert();
DataSet1->FieldByName("NAME")->AsString = "Пробник";

TMemoryStream* memStream = new TMemoryStream();
try
{
RichEdit1->Lines->SaveToStream(memStream);
memStream->Position = 0;
((TFIBBlobField*)DataSet1->FieldByName("DESCR"))->LoadFromStream(memStream);
}
__finally
{

delete memStream;
}

DataSet1->Post();




Данная ошибка вылезает после выполнения DataSet1->Post();

Текст ошибки:
Project Project1.exe raised exception class EFIBInterBaseError with message 'mainForm.ReadTransaction:
Unsuccessful execution caused by system error that does not preclude succesful execution of subsequent statements. Invalid transaction handle (expecting explicit transaction start).


Заранее спасибо!

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 мар 2008, 09:16

раскрасить не поленился, а тег code использовать? ...

1. не вижу type_id в insert. значит не читал www.ibase.ru/devinfo/generator.htm
2. segment size 400 - значит не читал FAQ - www.ibase.ru/ibfaq.htm
3. не вижу чтобы ты что-то записывал в столбец descr
4. с вопросами по FIBPlus надо обращаться на www.devrace.com

yamakasi
Сообщения: 2
Зарегистрирован: 20 мар 2008, 13:51

Сообщение yamakasi » 21 мар 2008, 10:50

kdv, спасибо за ответ.
kdv писал(а):раскрасить не поленился, а тег code использовать? ...
Раскрашивал для читабельности. А с тегом code как то раньше не работал :oops: каюсь.
kdv писал(а): 1. не вижу type_id в insert. значит не читал www.ibase.ru/devinfo/generator.htm
Читал, но видимо чего то не понимаю. Я использую генератор и триггер

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

CREATE GENERATOR GEN_type_conv_ID

CREATE OR ALTER TRIGGER TR_GEN_type_conv_ID FOR type_conv
ACTIVE BEFORE INSERT POSITION 0
AS

begin
  IF (NEW.type_id IS NULL) THEN 
    NEW.type_id=GEN_ID(GEN_type_conv_ID,1);

end 
kdv писал(а): 2. segment size 400 - значит не читал FAQ - www.ibase.ru/ibfaq.htm
Прочитал сейчас. Но причем тогда size 400? Насколько я понял - я могу указывать этот размер а могу и не указывать.
kdv писал(а):
3. не вижу чтобы ты что-то записывал в столбец descr

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

RichEdit1->Lines->SaveToStream(memStream); 
memStream->Position = 0; 
((TFIBBlobField*)DataSet1->FieldByName("DESCR"))->LoadFromStream(memStream);
А это разве не вставка? Меня именно этот кусок и интересует
При написании данного куска, я руководствовался книгой "Interbase и Firebird Практическое руководство для умных пользователей и начинающих разработчиков" Александра Бондаря.
там он использует такую конструкцию

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

Stream := TMemoryStream.Create;
  try
    RichEdit1.Lines.SaveToStream(Stream);
    Stream.Position := 0;
    TFIBBlobField(FormMain.DataSet1.FieldByName('DESCR')).LoadFromStream(Stream);
  finally
    Stream.Free;
  end;
  FormMain.DataSet1.Post;
Потом я просмотрел статью на сайте devrace там вроде также делается.
kdv писал(а):
4. с вопросами по FIBPlus надо обращаться на www.devrace.com
Согласен. Но ведь ваш сайт связан с разработкой ib/fb, а значит охватывает все возможные техники и методики. 8) или нет?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 21 мар 2008, 12:49

или нет?
по крайней мере, сюда разработчики FIBPlus не ходят. Я не запрещаю здесь задавать вопросы по FIBPlus, просто ответ на такой вопрос здесь маловероятен.
Invalid transaction handle
по-моему вполне понятное сообщение об ошибке..

Ответить