Здравствуйте,
Если создать процедуру с выходным параметром rowversion (timestamp), и вернуть в нём новую версию строки, например только, что вставленной, то в Delphi в данном параметре будут одни нули, то есть массив нулей, при этом тип параметра почему то не ftBytes с размером 8, а ftVarBytes с размером 8000. Тестовый пример вышлю на почту andreyz.
не возврощяет значение типа timestamp из процедуры
-
- Сообщения: 12
- Зарегистрирован: Ср 19 июн 2013 05:41
Re: не возврощяет значение типа timestamp из процедуры
Здравствуйте,
Спасибо за информацию. Я повторил и исправил данную проблему. Данное исправление войдет в следующий билд dbExpress driver for SQL Server.
Заметьте, что когда Вы будете использовать следующий код:, Вы будете получать 10 байт вместо 8. Данное поведение вызвано багом в методе TCustomSQLDataSet.GetOutputParams определенным в модуле Data.SqlExpr :
Как видите, даже если тип параметра ftBytes, буфер все равно увеличивается на два байта. Мы не можем повлиять на данное поведение.
Спасибо за информацию. Я повторил и исправил данную проблему. Данное исправление войдет в следующий билд dbExpress driver for SQL Server.
Заметьте, что когда Вы будете использовать следующий код:
Код: Выделить всё
SQLDataSet1.ParamByName('RowVer').AsBytes
Код: Выделить всё
//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);
-
- Сообщения: 12
- Зарегистрирован: Ср 19 июн 2013 05:41
Re: не возврощяет значение типа timestamp из процедуры
Спасибо, за данное исправление, очень выручило.
Заметил ещё одно не совсем мне понятную специфику работы драйвера, возможно Вы мне объясните.
При вызове процедуры генерируется вот такой код:
Параметр @p7 - int, @p8 - rowversion, их типы задаются ручками, остальные автоматом (то есть сначала Prepare формирует параметра потом параметры 7 и 8 корректируются)
Но на некоторых компьютерах формируется вот такой код:
Обратите внимание @p8 обявляеться не как varbinary(8) а как varbinary(8000), в результате при выполнении процедуры возникает ошибка "Invalid Length", и 6 параметр почемуто не "12.0000", а "$12.0000" хотя это вроде ни как не влияет на выполнение.
Я убрал настройку параметров 7 и 8, значение массива параметра 8 просто обрезаю первые 8 байт, ошибка вроде ушла, но хотелось бы понять, в чём может быть разница на компьютерах.
Заметил ещё одно не совсем мне понятную специфику работы драйвера, возможно Вы мне объясните.
При вызове процедуры генерируется вот такой код:
Код: Выделить всё
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
Но на некоторых компьютерах формируется вот такой код:
Код: Выделить всё
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
Я убрал настройку параметров 7 и 8, значение массива параметра 8 просто обрезаю первые 8 байт, ошибка вроде ушла, но хотелось бы понять, в чём может быть разница на компьютерах.
Re: не возврощяет значение типа timestamp из процедуры
Hello,
Что бы понять причину поведения нам необходимо знать параметры этих "некоторых компьютерах" (OC, версии библиотеки, региональные настройки, версии клиентов и.т.д.), пожалуйста укажите эти данные и мы попытаемся воспроизвести и разобраться в этом поведении.
P.S. Пожалуйста проверьте что версия библиотеки dbExpress driver for SQL Server одинакова на всех PC
Что бы понять причину поведения нам необходимо знать параметры этих "некоторых компьютерах" (OC, версии библиотеки, региональные настройки, версии клиентов и.т.д.), пожалуйста укажите эти данные и мы попытаемся воспроизвести и разобраться в этом поведении.
P.S. Пожалуйста проверьте что версия библиотеки dbExpress driver for SQL Server одинакова на всех PC