· Начало · Отвђтить · Статистика · Поиск · FAQ · Правила · Установки · Язык · Выход · WASM.RU · Noir.Ru ·

 WASM Phorum —› WASM.WIN32 —› Numeric и MSSQL2k проблема

Посл.отвђт Сообщенiе


Дата: Сен 8, 2004 19:54:14

Может кто сталкивался с проблемой следующего характера:
Я передаю в mssql запрос следущего вида
"update Table1 set Table1.Opt = ?
where Table1.Price = 5"
Передается это в функцию SQLPrepare.

Далее привязываю параметр:
invoke SQLBindParameter, hStmt, 1, SQL_PARAM_INPUT, SQL_С_NUMERIC, SQL_NUMERIC, 13, 2, offset Numeric_Var, sizeof Numeric_Var, offset TempVar

Numeric_Var - Это структура вида:
DB_NUMERIC struct
precision db ?
scale db ?
sign db ?
val db SQL_MAX_NUMERIC_LEN dup(?)
ends
DB_NUMERIC ends

В Numeric_Var для тестовых целей я записываю:
mov dword ptr [Numeric_Var.val], 11111111
mov byte ptr [Numeric_Var.scale], 3
mov byte ptr [Numeric_Var.sign], 1
т.е. число 11111.111

После SQLExecute получается, что в нужных записях находится не 11111.111, а 11111111.

Как с этим боротся? Или это глюк MS SQL Server'а???
Заранее спасибо!


Дата: Сен 11, 2004 21:05:44

Хммм... Такой вопрос..
А тип NUMERIC разве поддерживает вещественные числа?
Я вот попробовал - он тока целые вставляет.
Причем не только в MSSQL, но и в других базах.
Попробуй поменять тип столбца.


Дата: Сен 11, 2004 21:25:56

Блин, стормозил..
Короче, ты когда таблицу создавал, какой запрос делал?
Ты указывал сколько знаков после запятой нужно хранить? По умолчанию он хранит 0 знаков после запятой, поэтому надо вручную указывать.
..
Или тут все правильно указано?


Дата: Сен 12, 2004 02:39:55

Да нет, все правилно в свойствах таблицы нужное мне поле является типом NUMERIC(13,3)


Дата: Сен 13, 2004 19:55:48

Хех.. У меня тоже другую фигню записывает, но не так, как у тебя.
Ты не можешь показать полный исходник? Чтоб мы работали над один и тем же. Может, сообразим..


Дата: Сен 13, 2004 23:24:48

Вот исходник. Я пишу, используя RadAsm, так что если он у тебя тоже есть: распаковываешь, и компилишь. Только исправь строку соединения (conString) и запрос (UpdEntryQuery)

З.Ы. Интересно узнать чего у тебя за фигню вставляет!

_1063808715__ODBCTest.zip


Дата: Сен 14, 2004 01:34:33

Хмм.. У меня выдает такое же.. Будем смотреть.. Скорее всего это не глюк сервера, просто что-то не так делается..
Кстати, он у тебя вываливается в Exception при исполнении процедуры ODBCDisconnectFromDB.
Где именно я пока не понял (тока открыл..)


Дата: Сен 14, 2004 02:03:58

А ну да, конечно..
По поводу ODBCDisconnectFromDB.
Тебе ж надо SQLDisconnect делать для соединения, а не для hEnv! Кроме того, сначала закрывают соединение, а уж потом освобождают hEnv.
Короче, тебе надо написать так:
ODBCDisconnectFromDB proc hEnv:DWORD, hCon:DWORD
mov eax, dword ptr [hCon]
test eax, eax
jz @F
invoke SQLDisconnect, eax
invoke SQLFreeHandle, SQL_HANDLE_DBC, eax

@@:
mov eax, dword ptr [hEnv]
test eax, eax
jz @F

invoke SQLFreeHandle, SQL_HANDLE_ENV, eax
@@:
ret
ODBCDisconnectFromDB endp


Дата: Сен 14, 2004 12:00:10

Это я выдрал из своего большого проекта и подправил на скорую руку. Может чего не исправил. Вечером дома посмотрю, выложу исправленную версию! Если разберешься почему не так в mssql грузится напиши.


Дата: Сен 15, 2004 02:05:08

Хмм.. А где обещанная исправленная версия? :)
Я тут порылся по MSDN, нашел описание этого бага, симптомы совпадают и вот такую фразу (передаю общий смысл):
Microsoft подтвреждает наличие ошибки при работе с ODBC-драйверами для MS SQL Server.
.. (no comments)
Хотя, можь, они уже исправили этот баг, а у нас ошибка еще в чем-нибудь. Но я даже отладчиком проходился - вроде все как надо..
..
[offtop извиняте ради Бога, не сдержался]
Если не секрет, а что за большой проект такой? У меня что-то совсем нет идей, тем более на ASM (одна Java на ум лезет), а тут большой проект, да еще и с ODBC+MSSQL!
Хотя бы в общих чертах - буду знать в каком направлении думать. :)
[/offtop]


Дата: Сен 15, 2004 17:17:24

Это дошлепок к 1С:Бухгалтерия, что бы самому проводить документы.


Дата: Сен 15, 2004 21:47:35

А где именно это в MSDN написано? Чего-то я не могу найти. Хочется почитать оригинал.


Дата: Сен 16, 2004 14:37:27

Оба на!
Я решил эту проблемку!!
Похоже, в MSDN это я не то глянул или уже пофиксили.
Пришлось перелопатить MSDN, найти примеры работы с NUMERIC через ODBC, потом переводил с VC++ на MASM, хотя в итоге оказалось нужно лишь пару строчек. Короче, после SQLBindParameter добавляешь строки:
invoke SQLGetStmtAttr, hStmtSum,SQL_ATTR_APP_PARAM_DESC, addr hDesc, 0, NULL

invoke SQLSetDescField, hDesc, 1, SQL_DESC_TYPE, SQL_C_NUMERIC, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_PRECISION, 13, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_SCALE, 3, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_DATA_PTR, addr TestNum, 0

где hDesc объявлена как
hDesc dd ?

Вот какой комментарий написан к эти строчкам в MSDN:
Modify the fields in the implicit application parameter descriptor

Честно говоря, я пока не полностью разобрался что и как, но все работает! Проверено и перепроверено. :)
Попробуй у себя. Если не получится - выложу весь код.
Ну, а если это действительно помоголо - будешь должен.
Шутка. :)


Дата: Сен 16, 2004 14:38:41

Если получится - черкни тут пару строк - типа подтвреждение. А то, может, не в этом дело..


Дата: Сен 16, 2004 20:10:29

Спасибо! Пашет! Я тоже пробовал через
invoke SQLGetStmtAttr, hStmtSum,SQL_ATTR_APP_PARAM_DESC, addr hDesc, 0, NULL

invoke SQLSetDescField, hDesc, 1, SQL_DESC_TYPE, SQL_C_NUMERIC, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_PRECISION, 13, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_SCALE, 3, 0

invoke SQLSetDescField, hDesc, 1, SQL_DESC_DATA_PTR, addr TestNum, 0
но при этом убирал SQLBindParameter.
З.Ы. А лучше еще и вот так:
invoke SQLSetDescField, hDesc, 1, SQL_DESC_PRECISION, TestNum.precision, 0
invoke SQLSetDescField, hDesc, 1, SQL_DESC_SCALE, TestNum.scale, 0
вместо
invoke SQLSetDescField, hDesc, 1, SQL_DESC_PRECISION, 13, 0
invoke SQLSetDescField, hDesc, 1, SQL_DESC_SCALE, 3, 0


Powered by miniBB 1.6 © 2001-2002
Время загрузки страницы (сек.): 0.063