Asp classic ASP经典-类型不匹配:';CInt';-简单问题

Asp classic ASP经典-类型不匹配:';CInt';-简单问题,asp-classic,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/"

在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。经典的ASP。我很同情你:)不管怎样

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


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

与其转换为字符串,为什么不使用
CCur
(转换为货币),这样在进行算术运算时,逗号和任何货币符号(我认为)都会被有效地忽略?

可能会解决错误的问题,取决于数据库中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会循环生成一个总和。它生成的所有转换工作看起来都是人为的。

您有两个选择。您可以通过使用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
函数转换项(val)
出错时继续下一步
ConvertToInt=CInt(val)
如果错误号为0,则
ConvertToInt=空
呃,明白了
如果结束
端函数
或者返回0或Null或任何适合您的值,然后在trainCost代码中使用它


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

我认为,忽略所有异常是一个非常糟糕的想法。你最好首先防止出现异常;但我正在演示如何按照要求检测错误。我引用“有没有办法捕捉到这个错误?”。请在表决前阅读问题。错误恢复下一步是最后的手段,在这种情况下不需要。即使是,你也应该详细说明如何安全地使用它。@Silky,a)我可以看出你试图回答这个特定的问题,但这不是一个好的建议。b) 好的答案并不总是能回答特定的问题,而是能带来更好的实践。将货币值作为字符串存储在数据库中是问题的真正根源。@Anthony,虽然是真的,但问题的真正根源也是使用ASP。无论如何,这个论点是主观的;但我认为,否决某人对所提问题的答案是很奇怪的。不管各自为政。在很大程度上,这是一个自由的世界:)tblMain中Cost1字段的数据类型是什么?如果是字符串类型,为什么不是货币类型?好的,很抱歉,我忘了提到Cost1列包含的字符串可以是null、0.00英镑、0.00英镑、0英镑或TBC,因此无法将其格式化为字符串。抱歉,“因此无法将其格式化为货币”可能值得指出的是,您无法更改DB模式。这实际上是一个很好的观点。您甚至可以更进一步地问,“将其放在存储过程中并调用它,而不是使用内联SQL,这不是更好吗?”。是的,为了避免潜在的不可靠的字符串连接,允许SQL注入,我之前几乎添加了一条注释。该列不是数字类型,而是字符串。不要问我为什么这是一个遗留项目。请注意,VBScript非常乐意转换包含的数字字符串。和,甚至使用CInt将currency符号前缀为Int。实际上,CInt使用与CDouble或CSingle中相同的解析,然后将结果值转换为Int。因此,CInt(“123.6”)的结果为124.Doh!我的工作语言有很多细微的不同。你当然是对的,它是圆的。干杯,安东尼。
Function ConvertToInt(val)
    On Error Resume Next
    ConvertToInt = CInt(val)
    If Err.Number <> 0 Then
        ConvertToInt = Empty
        Err.Clear
    End If
End Function