RecordSize and Offset
RecordSize and Offset
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) ?
Создаем таблицу:
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) ?
Re: RecordSize and Offset
Добрый день,
BDE при расчете RecordSize берет длину строки, те есть в вашем примере
Мы для строковых полей при расчете RecordSize берем размер указателя
,
где Indicator = Fields.Count * sizeof(smallint) для хранения информации поле Null/Not Null
Если вы хотите добиться одинакового поведения с BDE вам необходимо установить свойство FlatBuffers в true, в этом случае в ODAC будет также браться размер строки. Но для корректного работы мы округляем длину до четного числа, т.е. 41 -> 42. При использовании этого параметра RecordSize будет равен 44
P.S. Мы не рекомендуем обращаться к полям по адресу
BDE при расчете RecordSize берет длину строки, те есть в вашем примере
Код: Выделить всё
BDE.RecordSize = sizeof(Double) + Field.Length + 1 // 8 + 40 + 1 = 53
Код: Выделить всё
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. Мы не рекомендуем обращаться к полям по адресу
Re: RecordSize and Offset
Добрый день,
Спасибо все получилось.
А как вы рекомендуете кешировать информацию для полей типа fkCalculated ?
Для каждой записи продолжительная процедура получения информации и без нужды не хочется ее
вызывать.
Сейчас храниться в DataSet->ActiveBuffer() + DataSet->RecordSize + CalcField->Offset.
Спасибо все получилось.
А как вы рекомендуете кешировать информацию для полей типа fkCalculated ?
Для каждой записи продолжительная процедура получения информации и без нужды не хочется ее
вызывать.
Сейчас храниться в DataSet->ActiveBuffer() + DataSet->RecordSize + CalcField->Offset.
Re: RecordSize and Offset
Вы можете использовать опцию UniQuery1.Options.CacheCalcFields, если эта опция установлена в true значения Calc и LookUp полей будут вычисляться только один раз при фетче.
Re: RecordSize and Offset
Спасибо, мы попробуем.
Re: RecordSize and Offset
Пожалуйста. Обращайтесь к нам если у Вас возникнут дальнейшие вопросы по ODAC.
Re: RecordSize and Offset
Добрый день!
А если поле типа fkCalculated изменил пользователь - как узнать старое (до корректировки) значение для возможности дальнейшей обработки ?
А если поле типа fkCalculated изменил пользователь - как узнать старое (до корректировки) значение для возможности дальнейшей обработки ?
Re: RecordSize and Offset
Свойство OldValue для полей fkCalculated всегда возвращает Null, поэтому вы не сможете получить "старое" значение.
Re: RecordSize and Offset
Спасибо. Очень жаль, что у вас это не поддерживается.
Re: RecordSize and Offset
Это поведение не поддерживаеться на базовом уровне Delphi, и мы не можем изменить это поведение