Topic: v1.12 и MSSQL200: еще наблюдения
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
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)На всех этапах - 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
|
|
Diman
Admin
 Admin
| Posts: 1482 |  | Karma: 19 |
|
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.Приведите текст запроса.
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
Re:v1.12 и MSSQL200: еще наблюдения
|
|
Posted: 2007/08/16 07:58 |
|
|
|
|
C 1. разобрался - неверно передавал параметр. Теперь другая беда - при повторном вызове процедуры с другими параметрами в Open получаю:
EXIT SQLFetch with return code -1 (SQL_ERROR)
HSTMT 01214F38
DIAG [07006] [Microsoft][ODBC SQL Server Driver]Нарушение атрибута с ограничением на тип данных (0)
| С чем это может быть связано? Если поменять вызовы местами - первый срабатывает, во втором - тоже самое.
Попутно. Как передать процедуре параметр типа varbinary в Executor-е? И как это сделать платформонезависимо в коде?
|
|
Diman
Admin
 Admin
| Posts: 1482 |  | Karma: 19 |
|
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)
|
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
Re:v1.12 и MSSQL200: еще наблюдения
|
|
Posted: 2007/08/17 00:25 |
|
|
|
|
DIAG [07006] Нужен тестовый пример. С тестовым примером пока туго. Однако, ситуация лечится выполнением Unprepare перед Open. Похожую проблему мы лечили для MySQL в начале апреля.
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
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=5, L=5, V='0.01']
|
Базу смотрю через EMS SQL Manager. В аналогичной базе, заполняемой через ADO, все числа - точные. Кстати, Enterprise Manager в обеих базах показывает точные значения. Выборки через AnyDAC дают значения с погрешностью.
Есть рекомендации?
|
|
Diman
Admin
 Admin
| Posts: 1482 |  | Karma: 19 |
|
Re:v1.12 и MSSQL200: еще наблюдения
|
|
Posted: 2007/08/17 07:51 |
|
|
|
|
DIAG [07006] 1) Ok. Тогда давайте AnyDAC трейс. 2) Как обход проблемы, попробуйте установить ResourceOptions.DirectExecute = True Выборки через AnyDAC дают значения с погрешностью. Если я правильно понял, то значения до БД доходят нормально. Если выбирать данные через ADO - все в порядке, если через AnyDAC - погрешность. Тогда давайте: - определение поля в таблице - пример данных - желательно AnyDAC трейс
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
Re:v1.12 и MSSQL200: еще наблюдения
|
|
Posted: 2007/08/20 02:53 |
|
|
|
|
DIAG [07006]
Судя по трейсу AnyDAC кеширует пареметры последнего набора данных и пытается использовать его при посторном вызове. Количество и типы колонок не совпадают, в результате получаем - DIAG [07006]. Так, при первом вызове между SQLNumResultCols и SQLGetCursorNameW идет определение типов колонок, затем формируется набор данных. При втором вызове определения типов нет и сразу подставляются колонки второго набора. У меня устойчивое дежа вю. По аналогичным граблям мы топтались с MySQL.
|
|
Diman
Admin
 Admin
| Posts: 1482 |  | Karma: 19 |
|
Re:v1.12 и MSSQL200: еще наблюдения
|
|
Posted: 2007/08/20 04:23 |
|
|
|
|
И так, как я понял:
Процедура возвращает несколько наборов данных. Первый раз она отрабатывает OK. При втором исполнении - DIAG [07006]. При этом значения входных параметров можно менять, можно не менят - ошибка гарантированна. Так ?
|
|
ak
User
 Expert Boarder
| Posts: 72 |   | Karma: 2 |
|
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
|
|
|
|