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

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

Запись/чтение массива в/из поле базы данных xml [D7, xml]


Nickolay ©   (2005-08-31 10:24:00) 

Здравствуйте!

Необходимо сначала записать массив в поле БД (компонент TClientDataSet, XML), а потом считать данные из поля в другой массив.

Сделал поле типа ftBlob с именем Arr. Потом:

var
 BlobStream   : TStream;
 BlobField    : TField;
 Buff, Buff2  : array[0..999] of LongInt;

...

// пишем
 ClientDataSet1.Append;
 BlobField := ClientDataSet1.FieldByName('Arr');
 BlobStream := ClientDataSet1.CreateBlobStream(BlobField, bmWrite);
 BlobStream.Write(Buff, Length(Buff));
 ClientDataSet1.Post;
 BlobStream.Free;

...

// читаем
 ClientDataSet1.Last;
 ClientDataSet1.Edit;
 BlobField := ClientDataSet1.FieldByName('Arr');
 BlobStream := ClientDataSet1.CreateBlobStream(BlobField, bmRead);
 BlobStream.Read(Buff2, Length(Buff2));
 BlobStream.Free;

...

Но при проверке выясняем, что значения массивов Buff и Buff2 не равны друг другу! Где ошибка?

Спасибо!


Desdechado   (2005-08-31 15:53:00) [1]

1. Locate( ключевое поле, значение, ...) Что именно не понятно? Или нет ключевого поля?
3. Тогда уж не 4*(...), а SizeOf( LongInt ) * (...)


Nickolay   (2005-08-31 14:36:00) [2]

1. А как по ключу Locate делать? И, зачем так?

2. Прогнал :)

3. Именно :) Поставил перед Post - сразу заработало! Видимо, когда Free делаешшь он из буфера информацию в базу данных загоняет. Но может и по другой причине...
Кстати, ведь второй параметр в Read и Write - число байт. Т. к. тип у меня LongInt, то нужно было писать не Length(Buff), а 4 * Length(Buff)!

Спасибо за помощь!


Desdechado   (2005-08-31 13:25:00) [3]

1. Не уверен, что Last даст переход на добавленную запись, особенно если в CDS есть активный индекс. Лучше по ключу Locate делать.
2. Не ясно, для чего делать Edit перед чтением
3. Не уверен, но имхо BlobStream.Free перед Post делать надо, в обратной последовательности у меня глюки были


Наверх

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