在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
答案 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)
On error resume next
然后在下一行,检查它是否有效。
虽然也许你想要CDouble。这是一个功能吗?我不记得了。