【问题标题】:If Not IsNull in ASP ClassicASP Classic 中的 If Not IsNull
【发布时间】:2023-04-21 00:12:02
【问题描述】:

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

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

这就是我所拥有的

<%=If Not IsNull(rs("ContractValue")) Then FormatNumber(rs("ContractValue"),0) end if%>

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

我做错了什么?

【问题讨论】:

  • 你在问如何做一个内联 if 语句,可能重复 *.com/questions/20353072/…
  • @TasosK。这不是他们要问的。
  • @Lankymart 恕我直言,这是尝试在一行中编写 if 语句,答案是使用 inline if。
  • @TasosK。 &lt;% If .... Then .... Else ... End If %&gt; 是经典 ASP 中的有效语法问题是 &lt;%= 导致语法错误,因为您不能 Response.Write If 语句。他们在问自己做错了什么,而不是如何写If 声明。

标签: vbscript asp-classic


【解决方案1】:

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

原因是 &lt;%= %&gt; 语法的简写

<% Response.Write %>

在经典 ASP 中。

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

<% Response.Write If Not IsNull(rs("ContractValue")) Then FormatNumber(rs("ContractValue"),0) End If %>

语法不正确,会触发Syntax Error

要修复代码,请从&lt;% %&gt; 标签中删除=,如下所示;

<% If Not IsNull(rs("ContractValue")) Then Response.Write FormatNumber(rs("ContractValue"),0) End If %>

IsNull怎么样?

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

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

数字检查示例

Dim contractValue
contractValue = rs("ContractValue") & ""
If Len(contractValue) > 0 And IsNumeric(contractValue) Then contractValue = Clng(contractValue) Else contractValue = 0

您可以通过编写一段可重用的代码来进一步实现这一点,IIf() 函数在本文中进行了说明。

类似的东西;

Dim contractValue
contractValue = rs("ContractValue") & ""
contractValue = IIf(Len(contractValue) > 0 And IsNumeric(contractValue), contractValue, 0)

@Paulmade a good point关于参数的评估,在原始代码中可能会中断

contractValue = IIf(Len(contractValue) > 0 And IsNumeric(contractValue), Clng(contractValue), 0)

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

【讨论】:

  • 就像IIf 的注释一样,你必须非常小心它的使用。不管你喜欢与否,IIf 中的所有参数都会被评估,因此如果 contractValue 不是数字(即 Null、Nothing 甚至是字符串),Lankymart 的版本很可能会崩溃。
  • 我在 Classic ASP (VBScript) 上工作了超过 12 年,我为我的个人库创建的最有用的函数系列之一是 toStr、toDbl、toInt ...它们都接收两个参数(value, defaultValue) 如果 value 不能转换为正确的类型,它将返回 defatulValue;从请求中获取参数并从数据库中获取值非常有用
  • @GerardoLima:我必须拥有的函数是FormData(dataItem, nullVal),它从发布的数据查询字符串数据中读取数据,如果不存在则分配一个默认值。太有用了,一个电话解决所有问题。
  • @GerardoLima 是的,但是没有什么能阻止这种方法被扩展到 Form(val, dataType, defVal) 之类的东西,使用常量作为数据类型并相应地处理它们,诚然这是更多的工作,你也可以得到边缘情况它只是无法按预期工作。
  • @GerardoLima: 是的,但是返回的数据无论如何都会是一个字符串。开发人员应该了解这一点并进行相应调整。如果他们不这样做,那么这是将计算机放回包装箱并运回供应商的经典案例。例如,我使用的技巧之一是使用postBack = (FormData("postBack", "false") = "true") 设置postBack 值。再一次记住一句古老的格言:“永远不要假设,因为它会让你和我成为一个混蛋”
【解决方案2】:
If Not IsNull(rs("ContractValue")) Then 
    <%=FormatNumber(rs("ContractValue"),0)%>
end if

不要着急使用 Classic ASP。

我确定您想在一些 HTML 代码之间插入内容,这会使您将所有这些代码捆绑在一起。如果是这种情况,我建议您将 VBscript 代码与 HTML 分开,例如如下所示;

<%
Dim valueToOutput

If Not IsNull(rs("ContractValue")) Then 
        valueToOutput=FormatNumber(rs("ContractValue"),0)
    end if
%>

<!-- HTML Code continues below with an inserted VBscript variable -->

There are a total of <%=valueToOutput%> oranges available!

【讨论】:

  • 好建议,尽可能将逻辑与演示分开。
  • 我发布了另一个问题,我认为您将能够指导/帮助我 - *.com/questions/33280063/…