我在使用 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")))
奇怪的地方有两部分
- 这只发生在特定的服务器上,此代码是我在多个站点上部署的 CMS 的一部分,并且只有在 IIS 6.0 上运行的实例才会给我带来问题。此外,这似乎取决于记录集选项。
- 根据官方 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/