RecordSize and Offset

Обсуждение возникших проблем, предложений и ошибок ODAC компонентов
Закрыто
petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

RecordSize and Offset

Сообщение petrel » Ср 12 фев 2014 06:21

Builder 6 ODAC 9.2.5

Создаем таблицу:
create table TestODAC ( field_number NUMBER, field_char2 varchar2(40) )

Формируем запрос
OraQuery->SQL->Text = "select field_number, field_char2 from TestODAC";

По логике RecordSize >= 49 (41+8)
Просматриваем существующий
ShowMessage(OraQuery->RecordSize);

BDE->RecordSize == 53

OraQuery->RecordSize == 16 Почему ?
Как работать с буфером в полях типа fkCalculated (там отсчет от RecordSize) ?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: RecordSize and Offset

Сообщение Alexp » Ср 12 фев 2014 11:03

Добрый день,

BDE при расчете RecordSize берет длину строки, те есть в вашем примере

Код: Выделить всё

BDE.RecordSize = sizeof(Double) + Field.Length + 1 // 8 + 40 + 1 = 53
Мы для строковых полей при расчете RecordSize берем размер указателя

Код: Выделить всё

ODAC.RecordSize = sizeof(Double) + sizeof(IntPtr) + Indicator // 8 + 4 + (2*2) = 16
,

где Indicator = Fields.Count * sizeof(smallint) для хранения информации поле Null/Not Null

Если вы хотите добиться одинакового поведения с BDE вам необходимо установить свойство FlatBuffers в true, в этом случае в ODAC будет также браться размер строки. Но для корректного работы мы округляем длину до четного числа, т.е. 41 -> 42. При использовании этого параметра RecordSize будет равен 44

P.S. Мы не рекомендуем обращаться к полям по адресу

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: RecordSize and Offset

Сообщение petrel » Ср 12 фев 2014 12:37

Добрый день,
Спасибо все получилось.

А как вы рекомендуете кешировать информацию для полей типа fkCalculated ?

Для каждой записи продолжительная процедура получения информации и без нужды не хочется ее
вызывать.
Сейчас храниться в DataSet->ActiveBuffer() + DataSet->RecordSize + CalcField->Offset.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: RecordSize and Offset

Сообщение Alexp » Ср 12 фев 2014 14:02

Вы можете использовать опцию UniQuery1.Options.CacheCalcFields, если эта опция установлена в true значения Calc и LookUp полей будут вычисляться только один раз при фетче.

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: RecordSize and Offset

Сообщение petrel » Чт 13 фев 2014 05:20

Спасибо, мы попробуем.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: RecordSize and Offset

Сообщение Alexp » Чт 13 фев 2014 08:24

Пожалуйста. Обращайтесь к нам если у Вас возникнут дальнейшие вопросы по ODAC.

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: RecordSize and Offset

Сообщение petrel » Ср 19 фев 2014 11:49

Добрый день!
А если поле типа fkCalculated изменил пользователь - как узнать старое (до корректировки) значение для возможности дальнейшей обработки ?

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: RecordSize and Offset

Сообщение Alexp » Пт 21 фев 2014 10:02

Свойство OldValue для полей fkCalculated всегда возвращает Null, поэтому вы не сможете получить "старое" значение.

petrel
Сообщения: 48
Зарегистрирован: Вт 30 окт 2012 11:43

Re: RecordSize and Offset

Сообщение petrel » Пн 24 фев 2014 09:18

Спасибо. Очень жаль, что у вас это не поддерживается.

Alexp
Devart Team
Сообщения: 349
Зарегистрирован: Пн 27 дек 2010 10:34

Re: RecordSize and Offset

Сообщение Alexp » Пн 24 фев 2014 13:53

Это поведение не поддерживаеться на базовом уровне Delphi, и мы не можем изменить это поведение

Закрыто