Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Запись и чтение строки из блоба


Sakipiel ©   (2014-06-22 12:43:00) 


Procedure TStoreClass.SaveAnyValueCompTable(Name, Parent, m: string);
var
 vBlob: TStream;
 maxSimb: integer;
begin
 if (Name = '') then
   exit;

 if FormAndControlList.Locate('Name;Parent', VarArrayOf([Name, Parent]), [])
 then
 begin
     FormAndControlList.Edit;
     vBlob := FormAndControlList.CreateBlobStream
       (FormAndControlList.FieldByName('AnyValue'), bmWrite);
     vBlob.Seek(0, soFromBeginning);
     vBlob.WriteBuffer(m[1], Length(m) * SizeOf(m[1]));
     vBlob.free;
     FormAndControlList.Post;
 end;

end;

Function TStoreClass.LoadAnyValueCompTable(Name, Parent:string; var m: string): boolean;
var
 vBlob: TStream;
begin
 result := false;

 if Name = '' then
   exit;

 if not FormAndControlList.Locate('Name;Parent', VarArrayOf([Name, Parent]), [])
 then
   exit;

 vBlob := FormAndControlList.CreateBlobStream
   (FormAndControlList.FieldByName('AnyValue'), bmRead);
 try
   vBlob.Seek(0, soFromBeginning); // sереход в начало потока BLOB
   vBlob.ReadBuffer(m[1], vBlob.Size);
   result := true;
 finally
   vBlob.free;
 end;

end;


в ClientDataSet есть поле с типом блоб, пытаюсь записывать и читать string в него и из него. Запись проходит, что при этом записывается мне не известно, т.к. не проходит загрузка, вылетая на строке vBlob.ReadBuffer(m[1], vBlob.Size); m[0] для стринг указать нельзя, 1 вызывает ошибку, просто m отрабатывает, но ничего не загружается.

определение procedure WriteBuffer(const Buffer; Count: Longint); ну и рид такое же, не дает мне понимания, чего же надо первым параметром передавать.


sniknik   (2014-06-23 18:30:00) [1]

и кстати символ #90 (не помню точно, может #$90) это был, давно признак конца текстовогофайла... (вроде даже у нортон командера из-за этого были проблемы с русской буквой р... да, точно значит #$90)


sniknik   (2014-06-23 18:26:00) [2]

> наверное это уже не текстовый файл
это позиционировалось как "управляющий-текстовый ascii файл",
но это неважно, т.к. в вопросе на что ответ, не про файл, а про строки, файл чисто для примера откуда такую строку можно "подцепить", и что там, в строке, может быть, чтобы предпочесть VARCHAR-у БЛОБ.

или это придирка к формулировке? ну скажем тогда не "текстовый", а "бинарный состоящий в основном из символов использующихся в текстовых файлах". так пойдет?


Игорь Шевченко   (2014-06-23 13:11:00) [3]


> текстовый файл из-за того что в нем, этом файле встречались
> управляющие ascii символы (#0 #27 #90


наверное это уже не текстовый файл


sniknik   (2014-06-23 08:14:00) [4]

> Зачем в БЛОБы строки писать, VARCHARa вам мало? ;)
текст предваряется обработкой при записи, блоб нет, я к примеру было записывал в блоб текстовый файл из-за того что в нем, этом файле встречались управляющие ascii символы (#0 #27 #90 ...  прога связь с которой делали их использовала/не работала без них), а запись в текстовое поле их преобразовывал и "резал" файл (и признак конца файла убирал, если доходил... а это для проги было "смертельно").
впрочем замена поля "текст" на поле "блоб" на дельфевую часть никак не повлияла, в дельфе строки это просто кусок памяти с количеством, т.е. обработка там как была до того как "особенности" заметили, так и осталась со сменой типа поля, даже перекомпиляции не потребовалось.


turbouser   (2014-06-22 17:57:00) [5]


> Андрюша   (22.06.14 17:50) [5]
>
> Зачем в БЛОБы строки писать, VARCHARa вам мало? ;)

NVARCHAR(MAX) тогда уж :)


Андрюша   (2014-06-22 17:50:00) [6]

Зачем в БЛОБы строки писать, VARCHARa вам мало? ;)


Sakipiel   (2014-06-22 13:12:00) [7]


> Перед чтением необходимо создать строку требуемого размера.


SetLength(m, vBlob.Size div SizeOf(char));

таки да


sniknik   (2014-06-22 13:04:00) [8]

AsString


Плохиш   (2014-06-22 12:56:00) [9]


> Sakipiel   (22.06.14 12:43) 

Перед чтением необходимо создать строку требуемого размера.


KilkennyCat   (2014-06-22 12:51:00) [10]


> вызывает ошибку

какую? неужто просто говорит "ошибка" ?


Наверх

Титульная страница Поиск, карта сайта Написать письмо