ASP Classic - 类型不匹配:'CInt' - 简单的问题

时间:2009-08-17 11:39:53

标签: asp-classic

在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)”

我猜这个问题与String值无法播放到Int有关,在这种情况下是否有任何方法可以捕获此错误?我没有使用asp经典,所以任何帮助都是有用的

欢呼声

- 编辑 -

列cost1的类型是String,因为它可能包含一个数字或一系列字符,例如£10.00或TBC

4 个答案:

答案 0 :(得分:12)

你有几个选择。您可以通过使用IsNumeric函数提前检查值是否为数字来主动:

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

...或者你可以通过使用错误捕获来反应;在Classic ASP中最容易定义函数并使用On Error Resume Next:

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

或者返回0或Null或任何适合你的东西,然后在你的trainCost代码中使用它。

请注意,CInt需要一个整数,并且会在第一个非数字处停止,因此“123.45”会返回123.请查看其他转换,CDouble,CCur等。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

潜在地解决错误的问题,取决于数据库中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会循环生成总和。它生成的所有转换工作看起来都很人性化。

答案 3 :(得分:-2)

嘿嘿嘿。经典ASP。你有我的遗憾:)无论如何,

On error resume next

然后在下一行,检查它是否有效。

虽然也许你想要CDouble。这是一个功能吗?我不记得了。