Additional
dbCAP
AnyDAC
ThinDAC
NCOCI8
Topic: v1.12 и MSSQL200: еще наблюдения
[1 2 |Next ]
v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/14 06:47
 
Приветсвую.

В ожидании v2 еще наблюдения за парой v1.12 и MSSQL2000.

1. В процедуре, возвращающей 2 набора, второй - не возвращается. После NextRecordSet RecordCount = 0. Процедура вызванная из EMS SQL Manager с теми же параметрами возвращает два набора, как и ожидалось. В Executor-е та же строка не возвращает данных вовсе (и время выполнения - порядка 50 мс)

2.Не сбрасывается размер массива параметров batch-insert. На одном компоненте TADQuery выполняется в цикле такая последовательность:
1)простой insert c 8 параметрами
2)batch-insert c 11 параметрами
3)batch-insert c 5 параметрами
Во втором проходе в 1) возникает исключение с жалобой на несоответствующую размерность массива 6-ого параметра. Проблема лечится добавлением в 1)

 Params.ArraySize := 0;

На всех этапах - SQL.Text присваивается новый.

3. Делаю insert с параметрами, полю типа real присваиваю значение

 Params[5].AsFloats[i] := 0.01;

В таблице оказывается число с "хвостом". В аналогичной ситуации при работе через ADO такого не было.

4. Попробовал использовать макро {dt <date & time>}. Если верить описанию, разделитель для времени - двоеточие. Выражение с двоеточием парсится как парамер. Лечится отключением разбора параметров.

Какие будут мысли?

Post edited by: ak, at: 2007/08/14 08:18
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/16 05:58
 
1. Возможно необходимо в батч поставить вначале SET NOCOUNT ON, что бы не создавались пустые наборы данных. Следующее работает без проблем и без SET NOCUNT ON в 2.0:

 ADQuery1.Open; .... ADQuery1.NextRecordSet; .... ADQuery1.NextRecordSet; ....


2.Это скорее всего фича. Когда вы меняете SQL текст, то если предыдущий и новый тексты имеют одноименные параметры,то их установки будут сохранены. В том числе и ArraySize. Поэтому после установки текста делайте Params.ArraySize := 0.
3.AsFloats будет передавать параметры серверу как SQL_DOUBLE, т.е. число с плавающей запятой. То что вы видите, это ошибка округления, свойственная всем таким числам. Если надо передавать точное значение, то AsFmtBCD := DoubleToBcd(0.01).
4.Приведите текст запроса.
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/16 07:58
 
C 1. разобрался - неверно передавал параметр. Теперь другая беда - при повторном вызове процедуры с другими параметрами в Open получаю:

 EXIT  SQLFetch  with return code -(SQL_ERROR)     HSTMT               01214F38     DIAG [07006] [Microsoft][ODBC SQL Server Driver]Нарушение атрибута с ограничением на тип данных (0

С чем это может быть связано? Если поменять вызовы местами - первый срабатывает, во втором - тоже самое.

Попутно. Как передать процедуре параметр типа varbinary в Executor-е? И как это сделать платформонезависимо в коде?
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/16 08:52
 
DIAG [07006]
Нужен тестовый пример.
Как передать процедуре параметр типа varbinary в Executor
Просто так - никак. Дождитесь 2.0 бета. Там:

 VAR P CHAR(10) = 'qweqwe' CALL MyProc(20'asdasd', :p)

Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/17 00:25
 
DIAG [07006]
Нужен тестовый пример.
С тестовым примером пока туго. Однако, ситуация лечится выполнением Unprepare перед Open. Похожую проблему мы лечили для MySQL в начале апреля.
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/17 03:21
 
3.AsFloats будет передавать параметры серверу как SQL_DOUBLE, т.е. число с плавающей запятой. То что вы видите, это ошибка округления, свойственная всем таким числам. Если надо передавать точное значение, то AsFmtBCD := DoubleToBcd(0.01).

Не помогает. Делаю batch-insert. Заполняю поля:

 Params[5].AsFmtBCDs[i] := DoubleToBcd(0.01);

Монитор показывает

 Data [I=5L=5V='0.01']


Базу смотрю через EMS SQL Manager. В аналогичной базе, заполняемой через ADO, все числа - точные. Кстати, Enterprise Manager в обеих базах показывает точные значения. Выборки через AnyDAC дают значения с погрешностью.

Есть рекомендации?
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/17 07:51
 
DIAG [07006]
1) Ok. Тогда давайте AnyDAC трейс.
2) Как обход проблемы, попробуйте установить ResourceOptions.DirectExecute = True
Выборки через AnyDAC дают значения с погрешностью.
Если я правильно понял, то значения до БД доходят нормально. Если выбирать данные через ADO - все в порядке, если через AnyDAC - погрешность. Тогда давайте:
- определение поля в таблице
- пример данных
- желательно AnyDAC трейс
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/20 02:53
 
DIAG [07006]

Судя по трейсу AnyDAC кеширует пареметры последнего набора данных и пытается использовать его при посторном вызове. Количество и типы колонок не совпадают, в результате получаем - DIAG [07006].
Так, при первом вызове между SQLNumResultCols и SQLGetCursorNameW идет определение типов колонок, затем формируется набор данных. При втором вызове определения типов нет и сразу подставляются колонки второго набора. У меня устойчивое дежа вю. По аналогичным граблям мы топтались с MySQL.
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/20 04:23
 
И так, как я понял:

Процедура возвращает несколько наборов данных. Первый раз она отрабатывает OK. При втором исполнении - DIAG [07006]. При этом значения входных параметров можно менять, можно не менят - ошибка гарантированна. Так ?
Re:v1.12 и MSSQL200: еще наблюдения
Posted: 2007/08/20 05:29
 
AnyDAC кеширует структуру второго набора и при повторном вызове пытается применить ее к первому набору. Парамеры процедуры значения не имеют.Думаю, это проявится на примере:

 CREATE PROCEDURE test AS BEGIN SELECT 1.0'a'1 SELECT 'a',1 END

[1 2 |Next ]