asp-classic - VBScript VarType 函数给出奇怪的值

标签 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. 根据官方 MSDN 引用,值 16 不是 VarType 返回的有效值

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

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

我必须执行上述操作,因为我需要相关函数来正确检测类型是否为数字,如果 VarType 为 16,则即使变量中的值为数字,IsNumeric() 也会给出 false(并且它将始终是数字)

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

最佳答案

正如 Stijn 所说,16 的值意味着它是一个One Byte Variant,在C++ headers作为 VT_I1

而且你得到这个值只是因为 MySQL 连接驱动程序(因为你已经说过你遇到这个 16 值的环境是带有 MySQL 的 IIS6)。

显然这是 MySQL 驱动程序中的错误,它不是报告 BIT 字段的 adBoolean,而是报告 VT_I1

关于asp-classic - VBScript VarType 函数给出奇怪的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/887495/

相关文章:

asp-classic - 在 ASP classic 中获取 Server.Executed 文件的名称

sql-server - IIS7/Classic ASP 中缺少值

IIS 6/COM+ 挂起

javascript - ASP 中的谷歌地图路线

asp-classic - ASP经典代码有人可以解释这段代码的作用吗?

asp-classic - 经典asp中的连接字符串

unix - 如何找到文件然后PSFTP到本地系统?

javascript - HTA 中的“另存为...”对话框

loops - VBScript 创建一个多维数组并添加到其中?

sql-server-2008 - 如何在旧的 ASP/VBScript 应用程序中使用 SQL Server 2008 存储过程的 Varchar(max) 输出?