代码之家  ›  专栏  ›  技术社区  ›  Jambobond

ASP经典-类型不匹配:“cint”-简单问题

  •  3
  • Jambobond  · 技术社区  · 16 年前

    在ASP Classic中存在类型转换问题。

    我的代码:

            Set trainingCost = Server.CreateObject("ADODB.Recordset")
        strSQL3 = "SELECT cost1 FROM tblMain WHERE (Booked = 'Booked') AND (Paid IS NULL) AND (PaidDate BETWEEN '01/04/" & startyear & "' AND '31/03/" & endyear & "')"
        trainingCost.Open strSQL3, Connection
        trainingCost.movefirst
        totalTrainCost = 0
        do while not trainingCost.eof
            trainCost = trainingCost("cost1")
            If NOT isNull(trainCost) then
                trainCostStr = CStr(trainCost)
                trainCostStr = Replace(trainCostStr, "£", "")
                trainCostStr = Replace(trainCostStr, ",", "")
                totalTrainCost = totalTrainCost + CInt(trainCostStr)
            end if
            trainingCost.movenext
        loop 
    
        trainingCost.close
    

    当我运行此程序时,会出现以下错误:

    Microsoft vbscript运行时(0x800A000D) 类型不匹配:“cint” /systems/rft/v1.2/extract.asp,第43行

    即“totaltraincost=totaltraincost+cint(traincoststr)”。

    我猜想问题在于字符串值不稳定到int,在这种情况下,有什么方法可以捕获这个错误?我没有和ASP Classic合作过很多,所以任何帮助都是有用的。

    干杯

    -编辑-

    列cost1的类型是字符串,因为它可能包含数字或字符序列,例如10.00英镑或tbc

    4 回复  |  直到 16 年前
        1
  •  11
  •   T.J. Crowder    16 年前

    你有几个选择。您可以提前使用isNumeric函数检查值是否为数字,从而采取主动措施:

     If IsNumeric(trainCostStr) Then
        totalTrainCost = totalTrainCost + CInt(trainCostStr)
     Else
        ' Do something appropriate
     End If
    

    …或者您可以通过使用错误捕获来进行响应;在经典的ASP中,定义函数和在错误恢复时使用可能最容易,接下来是:

    Function ConvertToInt(val)
        On Error Resume Next
        ConvertToInt = CInt(val)
        If Err.Number <> 0 Then
            ConvertToInt = Empty
            Err.Clear
        End If
    End Function
    

    或者返回0或空值或任何适合您的值,然后在traincost代码中使用它。

    请注意,CINT需要一个整数,并将在第一个非数字处停止,因此“123.45”返回为123。查看其他转换、双精度转换、CCUR等。

        2
  •  2
  •   Phil.Wheeler    16 年前

    为什么不使用 CCur (转换为货币)以便在进行算术运算时有效地忽略逗号和任何货币符号(我认为)?

        3
  •  2
  •   Andrew    16 年前

    可能解决了错误的问题,这取决于数据库中cost1的类型,但代码正在通过记录循环生成总计。

    strSQL3 = "SELECT sum(cost1) FROM tblMain WHERE (Booked = 'Booked') AND (Paid IS NULL) AND (PaidDate BETWEEN '01/04/" & startyear & "' AND '31/03/" & endyear & "')"        
    trainingCost.Open strSQL3, Connection 
    

    等等,把这个值作为一个总数。

    我不明白为什么当数据库可以为您工作时,RS会被循环生成一个和。它生成的所有转换工作看起来都是人工的。

        4
  •  -2
  •   Noon Silk    16 年前

    呵呵。经典ASP。我很遗憾:)不管怎样,

    On error resume next
    

    然后在下一行,检查它是否工作。

    也许你想要双倍的。这是函数吗?我不记得了。

    推荐文章