Найдено 12 результатов

MaratSafin
Ср 05 фев 2014 04:06
Форум: dbExpress драйверы
Тема: AV при получении значения поля с типом rowversion(timestamp)
Ответы: 3
Просмотры: 17411

Re: AV при получении значения поля с типом rowversion(timestamp)

Я Вам высылал скрипты ещё в начале Января, сразу после праздников, Вы получили письмо?
MaratSafin
Пн 13 янв 2014 04:25
Форум: dbExpress драйверы
Тема: не возврощяет значение типа timestamp из процедуры
Ответы: 3
Просмотры: 17263

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

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

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

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 байт, ошибка вроде ушла, но хотелось бы понять, в чём может быть разница на компьютерах.
MaratSafin
Чт 05 дек 2013 09:58
Форум: dbExpress драйверы
Тема: AV при получении значения поля с типом rowversion(timestamp)
Ответы: 3
Просмотры: 17411

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. Если после получения ошибки откатить транзакцию и повторить операцию, то всё нормально работает.
Текст процедуры могу выслать он не большой.
MaratSafin
Пн 25 ноя 2013 12:31
Форум: dbExpress драйверы
Тема: не возврощяет значение типа timestamp из процедуры
Ответы: 3
Просмотры: 17263

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

Здравствуйте,
Если создать процедуру с выходным параметром rowversion (timestamp), и вернуть в нём новую версию строки, например только, что вставленной, то в Delphi в данном параметре будут одни нули, то есть массив нулей, при этом тип параметра почему то не ftBytes с размером 8, а ftVarBytes с размером 8000. Тестовый пример вышлю на почту andreyz.
MaratSafin
Чт 21 ноя 2013 04:56
Форум: dbExpress драйверы
Тема: Сервер приложений DataSnap и GetProcedureParameters
Ответы: 7
Просмотры: 24241

Re: Сервер приложений DataSnap и GetProcedureParameters

Скачал dbExpress driver for SQL Server Standard Version 6.3.4 (22-Oct-2013). Но ни чего не изменилось. Ошибка осталась.
MaratSafin
Вт 19 ноя 2013 09:04
Форум: dbExpress драйверы
Тема: Сервер приложений DataSnap и GetProcedureParameters
Ответы: 7
Просмотры: 24241

Re: Сервер приложений DataSnap и GetProcedureParameters

А можно получить драйвер с данным исправлением, в ближайшее время, дело в том, что в декабре нужно внедрять проект?
Лицензию я приобрёл.
MaratSafin
Пт 25 окт 2013 03:59
Форум: dbExpress драйверы
Тема: Сервер приложений DataSnap и GetProcedureParameters
Ответы: 7
Просмотры: 24241

Re: Сервер приложений DataSnap и GetProcedureParameters

AndreyZ писал(а):Пришлите пожалуйста тестовый проект демонстрирующий данную проблему на andreyz*devart*com .
Отправил.
MaratSafin
Чт 24 окт 2013 09:36
Форум: dbExpress драйверы
Тема: Сервер приложений DataSnap и GetProcedureParameters
Ответы: 7
Просмотры: 24241

Сервер приложений 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 клиента:
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;
Вот кусок кода из трассировки сервера приложений:
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;
То есть имя процедуры "pAccountsSimpleSearch" потерялось на сервере приложений, при обращении к "DevArt SQL Server", можно было бы сказать, что проблема в DataSnap Сервере, но с драйвером Embarcadero MSSQL всё работает, нормально.
MaratSafin
Сб 12 окт 2013 04:05
Форум: dbExpress драйверы
Тема: sql_variant mapping
Ответы: 7
Просмотры: 23625

Re: sql_variant mapping

Не подскажите, что то решили по данной проблеме?
MaratSafin
Пт 21 июн 2013 07:01
Форум: dbExpress драйверы
Тема: sql_variant mapping
Ответы: 7
Просмотры: 23625

Re: sql_variant mapping

Можно ещё вопрос по этой же проблеме.
Драйвер dbExpress использует для sql_variant строку с максимальной длинной 16 символов. В результате TClientDataSet не даёт записать в поле более 16 символов. Можно как то установить максимальный размер строки?
MaratSafin
Чт 20 июн 2013 10:48
Форум: dbExpress драйверы
Тема: sql_variant mapping
Ответы: 7
Просмотры: 23625

Re: sql_variant mapping

Спасибо, это я как то не проверил :(
MaratSafin
Ср 19 июн 2013 05:52
Форум: dbExpress драйверы
Тема: sql_variant mapping
Ответы: 7
Просмотры: 23625

sql_variant mapping

При использовании dbExpress драйвера, для типа MS SQL sql_variant используется тип Delphi TStringField, это не удобно, так как необходимо, что бы в базе данные сохранялись именно, с типом с каким их внесли на клиенте. Мы используем связку TSQLDataSet -> TDataSetProvider -> TClientDataSet в результате в TClientDataSet поле sql_variant имеет тип string, в место Variant. Можно как то сделать, что бы для поля sql_variant в место типа TStringField использовался TVariantField?