Функция VBScript VarType дает странное значение - PullRequest
3 голосов
/ 20 мая 2009

Я столкнулся со странной проблемой с получением данных из базы данных и преобразованием их в правильный тип с использованием VBScript для ASP.

У меня есть набор записей, полученный с помощью следующей функции:

Public Function vfuncGetRS(strQuery)
    'Returns a disconnected paging capable recordset
    'Note - Non Windows servers don't support disconnected recordsets so you'll always get a connected recordset on
    '   a non Windows server!

    On Error Resume Next
    Err.Clear

    Dim objData

    Set objData = Server.CreateObject("ADODB.Recordset")
    objData.CursorLocation = adUseClient
    objData.CursorType = adOpenStatic
    objData.LockType = adLockReadOnly
    objData.Open vlogSQLFilter(strQuery), objDB

    If Not blnUNIXMode Then
        Set objData.ActiveConnection = Nothing
    End If

    Set vfuncGetRS = objData
End Function

Если я выбираю значение из набора записей и получаю его VarType, он возвращает значение 16, например.

Set objRS = vfuncGetRS("SELECT * FROM SOME_TABLE")
Response.Write(VarType(objRS("someColumn")))

Странность состоит из двух частей

  1. Это ТОЛЬКО происходит на конкретном сервере, этот код является частью CMS, которую я развертываю на нескольких сайтах, и только один экземпляр, работающий на IIS 6.0, вызывает у меня проблему. Также, похоже, это зависит от параметров набора записей.
  2. Значение 16 не является допустимым значением для VarType для возврата в соответствии с официальной ссылкой MSDN

Я могу обойти это довольно легко, добавив проверку к функции, на которую влияют странные значения, которые следующие:

If VarType(strValue) = 16 Then strValue = CInt(strValue)

Я должен сделать выше, потому что мне нужна рассматриваемая функция, чтобы правильно определить, что тип является числовым, и если VarType равен 16, то IsNumeric () дает false, даже если значение в переменной является числовым (и это всегда быть числовым)

Итак, мой вопрос: кто-нибудь знает, почему это происходит?

Ответы [ 2 ]

3 голосов
/ 20 мая 2009

Как указано Stijn, значение 16 означает, что это One Byte Variant, указанное в заголовках C ++ как VT_I1.

И вы получаете это значение только из-за драйвера соединения MySQL (поскольку вы заявили, что среда, в которой вы встречаете это значение 16, - это IIS6 с MySQL).

Очевидно, что это ошибка в драйвере MySQL, которая вместо сообщения adBoolean для поля BIT сообщает VT_I1.

0 голосов
/ 20 мая 2009

Согласно это , 16 может обозначать VT_I1, таким образом, одно целое число со знаком байта.

...