не возврощяет значение типа timestamp из процедуры

Обсуждение возникших проблем, предложений и ошибок dbExpress драйверов
Ответить
MaratSafin
Сообщения: 12
Зарегистрирован: Ср 19 июн 2013 05:41

не возврощяет значение типа timestamp из процедуры

Сообщение MaratSafin » Пн 25 ноя 2013 12:31

Здравствуйте,
Если создать процедуру с выходным параметром rowversion (timestamp), и вернуть в нём новую версию строки, например только, что вставленной, то в Delphi в данном параметре будут одни нули, то есть массив нулей, при этом тип параметра почему то не ftBytes с размером 8, а ftVarBytes с размером 8000. Тестовый пример вышлю на почту andreyz.

AndreyZ
Devart Team
Сообщения: 328
Зарегистрирован: Чт 08 сен 2011 13:18

Re: не возврощяет значение типа timestamp из процедуры

Сообщение AndreyZ » Вт 26 ноя 2013 16:06

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

Спасибо за информацию. Я повторил и исправил данную проблему. Данное исправление войдет в следующий билд dbExpress driver for SQL Server.
Заметьте, что когда Вы будете использовать следующий код:

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

SQLDataSet1.ParamByName('RowVer').AsBytes
, Вы будете получать 10 байт вместо 8. Данное поведение вызвано багом в методе TCustomSQLDataSet.GetOutputParams определенным в модуле Data.SqlExpr :

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

              //Two byte length prefix for varbinary
              if (Param.DataType = ftBytes) or (Param.DataType = ftVarBytes) then
                SetLength(Bytes, FDBXCommand.Parameters[I].Size+2)
              else
                SetLength(Bytes, FDBXCommand.Parameters[I].Size);
Как видите, даже если тип параметра ftBytes, буфер все равно увеличивается на два байта. Мы не можем повлиять на данное поведение.

MaratSafin
Сообщения: 12
Зарегистрирован: Ср 19 июн 2013 05:41

Re: не возврощяет значение типа timestamp из процедуры

Сообщение MaratSafin » Пн 13 янв 2014 04:25

Спасибо, за данное исправление, очень выручило.
Заметил ещё одно не совсем мне понятную специфику работы драйвера, возможно Вы мне объясните.
При вызове процедуры генерируется вот такой код:

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

declare @p7 int
set @p7=1
declare @p8 varbinary(8)
set @p8=0x000000000853EBCA
exec [pIndividualMetersGroupsActionsIndicationsSave] 470317,0x000000000853EBB0,10880894,457408,0,12.0000,@p7 output,@p8 output
select @p7, @p8
Параметр @p7 - int, @p8 - rowversion, их типы задаются ручками, остальные автоматом (то есть сначала Prepare формирует параметра потом параметры 7 и 8 корректируются)
Но на некоторых компьютерах формируется вот такой код:

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

declare @p7 int
set @p7=1
declare @p8 varbinary(8000)
set @p8=0x000000000853EBC8
exec [pIndividualMetersGroupsActionsIndicationsSave] 470316,0x000000000853EBB0,10880894,457408,0,$12.0000,@p7 output,@p8 output
select @p7, @p8
Обратите внимание @p8 обявляеться не как varbinary(8) а как varbinary(8000), в результате при выполнении процедуры возникает ошибка "Invalid Length", и 6 параметр почемуто не "12.0000", а "$12.0000" хотя это вроде ни как не влияет на выполнение.
Я убрал настройку параметров 7 и 8, значение массива параметра 8 просто обрезаю первые 8 байт, ошибка вроде ушла, но хотелось бы понять, в чём может быть разница на компьютерах.

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

Re: не возврощяет значение типа timestamp из процедуры

Сообщение Alexp » Пт 17 янв 2014 12:17

Hello,

Что бы понять причину поведения нам необходимо знать параметры этих "некоторых компьютерах" (OC, версии библиотеки, региональные настройки, версии клиентов и.т.д.), пожалуйста укажите эти данные и мы попытаемся воспроизвести и разобраться в этом поведении.

P.S. Пожалуйста проверьте что версия библиотеки dbExpress driver for SQL Server одинакова на всех PC

Ответить