Здравствуйте! Помогите пожалуйста разобраться со следующей проблемой:
Исходные данные:
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,
ESCR
)
b. Update
UPDATE TYPE_CONV
SET
NAME = :NAME,
TIMECREATED = :TIMECREATED,
DESCR = ESCR
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).
Заранее спасибо!
заморочки с FibPlus и Blob
Модератор: kdv
раскрасить не поленился, а тег 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
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
kdv, спасибо за ответ.
А это разве не вставка? Меня именно этот кусок и интересует
При написании данного куска, я руководствовался книгой "Interbase и Firebird Практическое руководство для умных пользователей и начинающих разработчиков" Александра Бондаря.
там он использует такую конструкцию
Потом я просмотрел статью на сайте devrace там вроде также делается.
Раскрашивал для читабельности. А с тегом code как то раньше не работал каюсь.kdv писал(а):раскрасить не поленился, а тег code использовать? ...
Читал, но видимо чего то не понимаю. Я использую генератор и триггер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
Прочитал сейчас. Но причем тогда size 400? Насколько я понял - я могу указывать этот размер а могу и не указывать.kdv писал(а): 2. segment size 400 - значит не читал FAQ - www.ibase.ru/ibfaq.htm
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;
Согласен. Но ведь ваш сайт связан с разработкой ib/fb, а значит охватывает все возможные техники и методики. или нет?kdv писал(а):
4. с вопросами по FIBPlus надо обращаться на www.devrace.com