ASP Classic 中的 If Not IsNull

Gin*_*ave 5 vbscript asp-classic

我对asp还很陌生,我有一个语法错误,如果可以的话,我希望得到帮助。

我有一个 ASP 页面,它显示了一个从 sql 中提取数据的表。大多数数据尚未填充,因此返回 NULL。有问题的数据类型是数字。我需要FormatNumberrs时候它不为空,如果它不填充。

这就是我所拥有的

<%=If Not IsNull(rs("ContractValue")) Then FormatNumber(rs("ContractValue"),0) end if%>
Run Code Online (Sandbox Code Playgroud)

但如前所述,我收到语法错误。

我究竟做错了什么?

Lan*_*art 7

我建议不要IsNull()在这种情况下使用,而是先回答有关语法错误的问题。

原因是<%= %>它的简写语法

<% Response.Write %>
Run Code Online (Sandbox Code Playgroud)

在经典 ASP 中。

因此,如果不使用速记方法编写,您实际上在做什么;

<% Response.Write If Not IsNull(rs("ContractValue")) Then FormatNumber(rs("ContractValue"),0) End If %>
Run Code Online (Sandbox Code Playgroud)

这是不正确的语法,会触发Syntax Error.

要修复代码,请=<% %>标签中删除,如下所示;

<% If Not IsNull(rs("ContractValue")) Then Response.Write FormatNumber(rs("ContractValue"),0) End If %>
Run Code Online (Sandbox Code Playgroud)

怎么用IsNull

虽然这可以工作,但通常会产生奇怪的结果,因为 DBNull (取决于所使用的数据库)可能不同,并且通常与 VBScriptvbNull变体不同。

由于这一点以及 VBScript 不是强类型的事实,我发现使用简单的快速转换为字符串以避免空值然后检查有效数据很有用。

示例数字检查

Dim contractValue
contractValue = rs("ContractValue") & ""
If Len(contractValue) > 0 And IsNumeric(contractValue) Then contractValue = Clng(contractValue) Else contractValue = 0
Run Code Online (Sandbox Code Playgroud)

你可以通过编写一段可重用的代码来进一步实现这一点,该代码IIf()在这篇文章中解释过。

像这样的东西;

Dim contractValue
contractValue = rs("ContractValue") & ""
contractValue = IIf(Len(contractValue) > 0 And IsNumeric(contractValue), contractValue, 0)
Run Code Online (Sandbox Code Playgroud)

@Paul 关于参数的评估提出了一个很好的观点,在原始代码中可能会破坏

contractValue = IIf(Len(contractValue) > 0 And IsNumeric(contractValue), Clng(contractValue), 0)
Run Code Online (Sandbox Code Playgroud)

因为Clng(contractValue)无论结果是True还是都会被评估False。因此,任何格式都需要在之后进行,或者IIf()构建更复杂的函数版本。