Найдено 12 результатов
- Ср 05 фев 2014 04:06
- Форум: dbExpress драйверы
- Тема: AV при получении значения поля с типом rowversion(timestamp)
- Ответы: 3
- Просмотры: 17597
Re: AV при получении значения поля с типом rowversion(timestamp)
Я Вам высылал скрипты ещё в начале Января, сразу после праздников, Вы получили письмо?
- Пн 13 янв 2014 04:25
- Форум: dbExpress драйверы
- Тема: не возврощяет значение типа timestamp из процедуры
- Ответы: 3
- Просмотры: 17426
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 байт, ошибка вроде ушла, но хотелось бы понять, в чём может быть разница на компьютерах.
- Чт 05 дек 2013 09:58
- Форум: dbExpress драйверы
- Тема: AV при получении значения поля с типом rowversion(timestamp)
- Ответы: 3
- Просмотры: 17597
AV при получении значения поля с типом rowversion(timestamp)
Здравствуйте,
К сожалению сделать демонстрационный пример отдельно от разрабатываемого ПО не получается, но ошибка возникает стабильно.
Есть процедура которая возвращает набор данных из одной строки с полями result(тип int) и new_row_version(тип rowversion), процедура отрабатывает нормально, значение поля result читается нормально, при получении значения поля new_row_version получаем AV, при чём если повторить выполнение процедура через несколько секунд то всё работает нормально.
В общем при каких условиях воспроизводиться ошибка у меня:
1. Сервер Windows Server 2012 x64 виртуалка (что интересно на x32 Windows 7 всё работает нормально), SQL Server 2012, нативный клиент 2012.
2. Процедура на входе получает rowversion старой записи, выполняет поиск записи и если запись существует выполняет обновление, если нет вставку и возвращает rowversion обновлённой или вставленной записи. Если происходит вставка то ошибка не воспроизводиться.
3. Если после получения ошибки откатить транзакцию и повторить операцию, то всё нормально работает.
Текст процедуры могу выслать он не большой.
К сожалению сделать демонстрационный пример отдельно от разрабатываемого ПО не получается, но ошибка возникает стабильно.
Есть процедура которая возвращает набор данных из одной строки с полями result(тип int) и new_row_version(тип rowversion), процедура отрабатывает нормально, значение поля result читается нормально, при получении значения поля new_row_version получаем AV, при чём если повторить выполнение процедура через несколько секунд то всё работает нормально.
В общем при каких условиях воспроизводиться ошибка у меня:
1. Сервер Windows Server 2012 x64 виртуалка (что интересно на x32 Windows 7 всё работает нормально), SQL Server 2012, нативный клиент 2012.
2. Процедура на входе получает rowversion старой записи, выполняет поиск записи и если запись существует выполняет обновление, если нет вставку и возвращает rowversion обновлённой или вставленной записи. Если происходит вставка то ошибка не воспроизводиться.
3. Если после получения ошибки откатить транзакцию и повторить операцию, то всё нормально работает.
Текст процедуры могу выслать он не большой.
- Пн 25 ноя 2013 12:31
- Форум: dbExpress драйверы
- Тема: не возврощяет значение типа timestamp из процедуры
- Ответы: 3
- Просмотры: 17426
не возврощяет значение типа timestamp из процедуры
Здравствуйте,
Если создать процедуру с выходным параметром rowversion (timestamp), и вернуть в нём новую версию строки, например только, что вставленной, то в Delphi в данном параметре будут одни нули, то есть массив нулей, при этом тип параметра почему то не ftBytes с размером 8, а ftVarBytes с размером 8000. Тестовый пример вышлю на почту andreyz.
Если создать процедуру с выходным параметром rowversion (timestamp), и вернуть в нём новую версию строки, например только, что вставленной, то в Delphi в данном параметре будут одни нули, то есть массив нулей, при этом тип параметра почему то не ftBytes с размером 8, а ftVarBytes с размером 8000. Тестовый пример вышлю на почту andreyz.
- Чт 21 ноя 2013 04:56
- Форум: dbExpress драйверы
- Тема: Сервер приложений DataSnap и GetProcedureParameters
- Ответы: 7
- Просмотры: 24442
Re: Сервер приложений DataSnap и GetProcedureParameters
Скачал dbExpress driver for SQL Server Standard Version 6.3.4 (22-Oct-2013). Но ни чего не изменилось. Ошибка осталась.
- Вт 19 ноя 2013 09:04
- Форум: dbExpress драйверы
- Тема: Сервер приложений DataSnap и GetProcedureParameters
- Ответы: 7
- Просмотры: 24442
Re: Сервер приложений DataSnap и GetProcedureParameters
А можно получить драйвер с данным исправлением, в ближайшее время, дело в том, что в декабре нужно внедрять проект?
Лицензию я приобрёл.
Лицензию я приобрёл.
- Пт 25 окт 2013 03:59
- Форум: dbExpress драйверы
- Тема: Сервер приложений DataSnap и GetProcedureParameters
- Ответы: 7
- Просмотры: 24442
Re: Сервер приложений DataSnap и GetProcedureParameters
Отправил.AndreyZ писал(а):Пришлите пожалуйста тестовый проект демонстрирующий данную проблему на andreyz*devart*com .
- Чт 24 окт 2013 09:36
- Форум: dbExpress драйверы
- Тема: Сервер приложений DataSnap и GetProcedureParameters
- Ответы: 7
- Просмотры: 24442
Сервер приложений DataSnap и GetProcedureParameters
Здравствуйте,
Разрабатываем Мы сервер приложений на технологии DataSnap Delphi XE3 сервер базы данных SQL Server 2012. В DataSnap сервере есть возможность выполнять SQL запросы прямо с клиента DataSnap. То есть цепочка получается такая TSQLDataSet -> TSQLConnection(DataSnap Client) -> DataSnap Server -> TDBXConnection (DevArt SQL Server) -> SQL Server 2012.
Для создания такой цепочки необходимо с клиента (DataSnap) на сервере (DataSnap) вызвать метод DSAdmin.GetConnection.
Теперь в чём проблема: если на клиенте TSQLDataSet в CommandType = ctStoredProc и CommandText содержит имя процедуры, то параметры TSQLDataSet (SQLDataSet.Params) не заполняются автоматически, точнее их там порядка 200 и все левые.
Вот кусок кода из трассировки DataSnap клиента:
Разрабатываем Мы сервер приложений на технологии DataSnap Delphi XE3 сервер базы данных SQL Server 2012. В DataSnap сервере есть возможность выполнять SQL запросы прямо с клиента DataSnap. То есть цепочка получается такая TSQLDataSet -> TSQLConnection(DataSnap Client) -> DataSnap Server -> TDBXConnection (DevArt SQL Server) -> SQL Server 2012.
Для создания такой цепочки необходимо с клиента (DataSnap) на сервере (DataSnap) вызвать метод DSAdmin.GetConnection.
Теперь в чём проблема: если на клиенте TSQLDataSet в CommandType = ctStoredProc и CommandText содержит имя процедуры, то параметры TSQLDataSet (SQLDataSet.Params) не заполняются автоматически, точнее их там порядка 200 и все левые.
Вот кусок кода из трассировки DataSnap клиента:
Вот кусок кода из трассировки сервера приложений:Log Opened ==========================================
{CONNECT } ConnectionC1.GetConnectionProperties;
{DRIVER UNKNOWN(} {read 27 bytes:{"result":[0,"DataSnap",2]}}
{DRIVER UNKNOWN(} {read 810 bytes:{"result":[{"rows":[0]},{"data":[1,`]},{"table":[{"fields":[0,false,1,0,true]},{"columns":[17,["QuoteChar",26,0,0,0,16,0,0],["ProcedureQuoteChar",26,0,0,0,16,0,0],["MaxCommands",6,0,0,0,0,0,0],["SupportsTransactions",4,0,0,0,0,0,0],["SupportsNestedTransactions",4,0,0,0,0,0,0],["SupportsRowSetSize",4,0,0,0,0,0,0],["ProductVersion",26,0,0,0,128,0,0],["ProductName",26,0,0,0,128,0,0],["QuotePrefix",26,0,0,0,16,0,0],["QuoteSuffix",26,0,0,0,16,0,0],["SupportsLowerCaseIdentifiers",4,0,0,0,0,0,0],["SupportsUpperCaseIdentifiers",4,0,0,0,0,0,0],["SupportsSPReturnCode",4,0,0,0,0,0,0],["SupportsParameterMetadata",4,0,0,0,0,0,0],["SupportsCatalogFunctions",4,0,0,0,0,0,0],["SupportsCatalogFunctions",4,0,0,0,0,0,0],["SupportsCatalogFunctions",4,0,0,0,0,0,0]]}]}]}{"data":[-37,!"!"d#127#255#255#255 $2008(DataSnap!"!" ]}}
{CONNECT } ConnectionC1.Open;
{METADATA } ConnectionC1.GetProductName;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{COMMAND } CommandC1_1 := ConnectionC1.CreateCommand;
{COMMAND } CommandC1_1.CommandType := 'DataSnap.ServerMethod';
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{COMMAND } CommandC1_1.CommandType := 'DataSnap.ServerMethod';
{COMMAND } CommandC1_1.Text := 'DSAdmin.GetConnection';
{PREPARE } CommandC1_1.Prepare;
{DRIVER UNKNOWN(} {read 136 bytes:{"result":[{"handle":[1]},{"fields":[0,false]},{"parameters":[2,[26,0,1,0,0,"NewConName",0,0,0],[34,0,4,0,0,"ReturnParameter",0,0,0]]}]}}
{COMMAND } ReaderC1_1_1 := CommandC1_1.ExecuteQuery;
{DRIVER UNKNOWN(} {read 40 bytes:{"result":[{"rows":[0]},{"data":[1,#192]}]}}
{EXECUTE } RowsAffectedC1_1 := CommandC1_1.RowsAffected
{EXECUTE } {RowsAffectedC1_1 = 0}
{COMMAND } FreeAndNil(CommandC1_1);
{METADATA } ConnectionC1.GetDatabaseMetaData;
{COMMAND } CommandC1_2 := ConnectionC1.CreateCommand;
{COMMAND } CommandC1_2.CommandType := 'Dbx.MetaData';
{COMMAND } CommandC1_2.Text := 'GetProcedureParameters "pAccountsSimpleSearch"';
{COMMAND } ReaderC1_2_1 := CommandC1_2.ExecuteQuery;
То есть имя процедуры "pAccountsSimpleSearch" потерялось на сервере приложений, при обращении к "DevArt SQL Server", можно было бы сказать, что проблема в DataSnap Сервере, но с драйвером Embarcadero MSSQL всё работает, нормально.Log Opened ==========================================
{CONNECT } ConnectionC1.GetConnectionProperties;
{CONNECT } ConnectionC1.Open;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{METADATA } ConnectionC1.GetDatabaseMetaData;
{COMMAND } CommandC1_1 := ConnectionC1.CreateCommand;
{COMMAND } CommandC1_1.CommandType := 'Dbx.MetaData';
{COMMAND } CommandC1_1.Text := 'GetProcedureParameters ';
{COMMAND } ReaderC1_1_1 := CommandC1_1.ExecuteQuery;
- Сб 12 окт 2013 04:05
- Форум: dbExpress драйверы
- Тема: sql_variant mapping
- Ответы: 7
- Просмотры: 23830
Re: sql_variant mapping
Не подскажите, что то решили по данной проблеме?
- Пт 21 июн 2013 07:01
- Форум: dbExpress драйверы
- Тема: sql_variant mapping
- Ответы: 7
- Просмотры: 23830
Re: sql_variant mapping
Можно ещё вопрос по этой же проблеме.
Драйвер dbExpress использует для sql_variant строку с максимальной длинной 16 символов. В результате TClientDataSet не даёт записать в поле более 16 символов. Можно как то установить максимальный размер строки?
Драйвер dbExpress использует для sql_variant строку с максимальной длинной 16 символов. В результате TClientDataSet не даёт записать в поле более 16 символов. Можно как то установить максимальный размер строки?
- Чт 20 июн 2013 10:48
- Форум: dbExpress драйверы
- Тема: sql_variant mapping
- Ответы: 7
- Просмотры: 23830
Re: sql_variant mapping
Спасибо, это я как то не проверил
- Ср 19 июн 2013 05:52
- Форум: dbExpress драйверы
- Тема: sql_variant mapping
- Ответы: 7
- Просмотры: 23830
sql_variant mapping
При использовании dbExpress драйвера, для типа MS SQL sql_variant используется тип Delphi TStringField, это не удобно, так как необходимо, что бы в базе данные сохранялись именно, с типом с каким их внесли на клиенте. Мы используем связку TSQLDataSet -> TDataSetProvider -> TClientDataSet в результате в TClientDataSet поле sql_variant имеет тип string, в место Variant. Можно как то сделать, что бы для поля sql_variant в место типа TStringField использовался TVariantField?