VBScript VarType函数给出了奇怪的值

时间:2009-05-20 11:55:36

标签: asp-classic vbscript

我遇到了一个奇怪的问题,即从数据库获取数据并使用VBScript for 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参考
  3. 返回的有效值

    通过对受奇怪值影响的函数添加一个检查,我可以相当容易地解决这个问题,如下所示

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

    我必须执行上述操作,因为我需要有问题的函数来正确检测类型是数字,如果VarType是16,那么即使变量中的值是数字,IsNumeric()也会给出false(并且它总是是数字)

    所以我的问题是有人知道为什么会这样吗?

2 个答案:

答案 0 :(得分:3)

正如Stijn所述,值16意味着它是 One Byte Variant ,在C++ headers中指定为{ {1}}。

你只是因为MySQL连接驱动程序而得到这个值(正如你所说,你遇到这个16值的环境是带有MySQL的IIS6)。

显然,这是MySQL驱动程序中的一个错误,而不是报告{BID字段VT_I1,而是报告adBoolean

答案 1 :(得分:0)

根据this,16可能代表VT_I1,因此是单字节有符号整数。