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