Проблема с десятичным значением набора записей ADO

У меня есть код, похожий на

Dim A, B, C
Set rs = Server.CreateObject("ADODB.Recordset")
strSql = "Exec [dbo].[some_sp] IND"
rs.open strSql,CN,3,3

Do While Not rs.EOF

'these columns are returned as decimal(10,2) format
A = rs("col1")
B = rs("col2")

rs.MoveNext
Loop

C = A + B 'i get type mismatch error here

И я использовал response.write для проверки значений для A, B, они в целочисленном формате, а не в десятичном формате.

Нужно ли мне снова форматировать набор записей, чтобы установить десятичные значения? И что может быть возможной проблемой несоответствия типов, поскольку все значения являются целыми (даже если они десятичные)?


person rs.    schedule 28.12.2009    source источник
comment
Ответ: Используется A = CDbl(rs(col1)) B = CDbl(rs(col2))   -  person rs.    schedule 29.12.2009


Ответы (2)


Переменные в ASP/VBScript — это просто типы вариантов, поэтому вам может потребоваться явное преобразование значений.

C = CDbl(A) + CDbl(B)

Однако я предполагаю, что одна из ваших строк не имеет числового значения для col1 или col2. Знаете ли вы, каковы их значения, когда вы получаете ошибку несоответствия типов?

person Shawn Steward    schedule 28.12.2009
comment
Кроме того, может ли процедура вернуть NULL? - person Sparky; 28.12.2009
comment
да, я сделал response.write для всех этих значений, вот результат 73, 0, 1, 0, 0, 0, 6. Я хочу, чтобы они были десятичными перед добавлением, но они в целых числах - person rs.; 28.12.2009
comment
я понял. Я использовал CDbl, и он работает (Cdec не будет работать) - person rs.; 29.12.2009
comment
Ах да, это не работает в VBScript. Я обновлю свой ответ с вашими выводами. - person Shawn Steward; 29.12.2009

В моей ситуации я обнаружил, что все, что находится справа от десятичной дроби, теряется, по существу возвращая целое число. Это в Access 2007 с ADO 2.8, вызов SQL на сервере DB2/400 v7r3.

Я пытался использовать VBA.CDbl() и CDec(), но ни один из них не работал. Затем чтение этой ветки вдохновило меня сначала попробовать преобразование на сервере, поэтому я CAST число в REAL, что составляет 32 бита (эквивалентно Single в VBA), и это сработало.

Этот:

SELECT (IYONHA / WXUNIT) AS VIPCASES
FROM   WINEX 

... стало так:

SELECT CAST(IYONHA / WXUNIT AS REAL) AS VIPCASES
FROM   WINEX

... а затем округление десятичных знаков до двух знаков стало следующим:

SELECT CAST(CAST(IYONHA / WXUNIT AS NUMERIC(5,2)) AS REAL) AS VIPCASES
FROM   WINEX
person spinjector    schedule 24.12.2018