![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Запись и чтение строки из блоба
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]
> вызывает ошибку
какую? неужто просто говорит "ошибка" ?