Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 29.01.2015, 12:55   #1
Winsight
Новичок
Пользователь
 
Регистрация: 29.01.2015
Сообщений: 13
По умолчанию FireBird Delphi Проблемма с BLOB текстом

По затее БЛОБ должен получать и выдавать текст в TMemo.

Таблица БД:
Код:
CREATE TABLE MES (
       ID_OBJ BIGINT NOT NULL,
       ID_FROM Integer NOT NULL,
       ID_TO Integer,
       MES_INDEX Integer NOT NULL,
       MES_TYPE Integer NOT NULL,
       MES_TEXT Blob SUB_TYPE 1 SEGMENT SIZE 40,
       MES_DATE Date DEFAULT 'NOW' NOT NULL
);
Пишу в блоб так:

Код:
var bs: tstream;
...
  dm.IBTransEdit.Active:=true; //транзакция
  dm.tr_edit_mes.Active:=true; //датасет
  dm.tr_edit_mes.Edit;
  dm.tr_edit_mes.FieldByName('MES_TEXT').Clear;
  bs:=dm.tr_edit_mes.CreateBlobStream(dm.tr_edit_mes.FieldByName('MES_TEXT'),tblobstreammode.bmWrite);
  oneform.mesText.Lines.SaveToStream(bs);
  bs.Free;
  dm.tr_edit_mes.Post;
  dm.IBTransEdit.Commit;
  dm.tr_edit_mes.Active:=false;
  dm.IBTransEdit.Active:=false;
...
Ошибок нет. Что-то туда легло. (bs.size>0)
Читаю так:

Код:
...
  zdl[i].blob:=tstringlist.Create;
  zdl[i].blob.Clear;
  bs := dm.DS_mess.CreateBlobStream(dm.DS_mess.FieldByName('MES_TEXT'),tblobstreammode.bmRead);
  zdl[i].blob.LoadFromStream(bs);
  bs.Free;
...
Итог:

Снимок.JPG

Последний раз редактировалось Winsight; 30.01.2015 в 08:20.
Winsight вне форума Ответить с цитированием
Старый 29.01.2015, 13:06   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Не мешало бы уточнить на какой строке кода ошибка
Телепартирую - позицию попробуй перед чтением из bs в 0 выставить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2015, 13:08   #3
Winsight
Новичок
Пользователь
 
Регистрация: 29.01.2015
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
Не мешало бы уточнить на какой строке кода ошибка
zdl[i].blob.LoadFromStream(bs);

Если в Базе MES_TEXT Null, то ошибок нет. Что в 0 выставить?

Пытался проверить содержимое, выводил в файл (через tfilestream). Получил в файле вместо текста строку вопросов.

Последний раз редактировалось Winsight; 29.01.2015 в 13:13.
Winsight вне форума Ответить с цитированием
Старый 29.01.2015, 13:12   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Position в bs
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2015, 13:18   #5
Winsight
Новичок
Пользователь
 
Регистрация: 29.01.2015
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
позицию попробуй перед чтением из bs в 0 выставить
Код:
  bs := dm.DS_mess.CreateBlobStream(dm.DS_mess.FieldByName('MES_TEXT'),tblobstreammode.bmRead);
  bs.Position:=0;
  zdl[i].blob.LoadFromStream(bs);
не помогло
Winsight вне форума Ответить с цитированием
Старый 29.01.2015, 13:20   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

bstream - чего это?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2015, 13:22   #7
Winsight
Новичок
Пользователь
 
Регистрация: 29.01.2015
Сообщений: 13
По умолчанию

bstream это bs... сократил уже здесь. Сейчас и в коде сократил, для синхронности...
Winsight вне форума Ответить с цитированием
Старый 29.01.2015, 13:34   #8
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

tblobstreammode.bmRead

Это не должно компилироваться. bmRead достаточно. Аналогично и tblobstreammode.bmWrite

А в файл что выгружается? Приложить можешь?
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 29.01.2015, 13:42   #9
Winsight
Новичок
Пользователь
 
Регистрация: 29.01.2015
Сообщений: 13
По умолчанию

Цитата:
Сообщение от Аватар Посмотреть сообщение
А в файл что выгружается? Приложить можешь?
Содержимое mesText (TMemo):
1234abcd
вторая строка
Код:
  bs := dm.DS_mess.CreateBlobStream(dm.DS_mess.FieldByName('MES_TEXT'),bmRead);
  bs.Position:=0;
  filestrim:=tfilestream.Create('c:\text.txt',fmopenwrite);
  filestrim.CopyFrom(bs,bs.Size);
  //zdl[i].blob.LoadFromStream(bs);
  bs.Free;
  filestrim.Free;
Содержимое текстовика:
???????????

Размер текстовика и bs.size совпадают

Последний раз редактировалось Winsight; 29.01.2015 в 13:47.
Winsight вне форума Ответить с цитированием
Старый 29.01.2015, 13:48   #10
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

bs.Free; не стал бы делать. Help гласит:

Цитата:
The stream that this method returns belongs to the dataset. Do not free the stream: the dataset handles all allocation and freeing of streams that this method creates.
Цитата:
Содержимое текстовика
Ни о чем не говорит. Файликом приложить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Firebird BLOB field default value - как?? DeveloPerchik БД в Delphi 3 24.05.2012 15:16
Blob-поля в Firebird Liones БД в Delphi 1 23.11.2010 11:45
создание blob поля в Firebird Lokos БД в Delphi 0 12.04.2010 07:58
Каракули при загрузке из Blob. Firebird nikmay БД в Delphi 4 01.10.2009 18:32