记录集rstimportdata(“扁平尺寸”)中的项目为= null

因此,给定以下声明:

IIF(IsNull(rstImportData("Flat Size")), Null, cstr(rstImportData("Flat Size")))
Result: Throws error 94: Invalid use of Null

如果我通过在错误比较时删除类型转换来更改陈述:

IIF(IsNull(rstImportData("Flat Size")), Null, 0)
Result: Null

它返回零,因为它应该是第一次。看来,如果传递的值通过IIF测试,我也不能在IIF中进行类型转换,它仍然试图以真实和错误的答案进行评估。我使用IIF的唯一原因是,我对25行进行了比较来将导入的数据与数据库中的匹配记录进行比较,以查看我是否需要附加历史记录。

有什么想法吗?导入数据的方式将有零日期以及电子表格导入以字符串格式的位置,我必须将任何一侧转换为另一侧才能正确比较值,但是如果两侧为null,则发生此例外:(

编辑为什么我使用IIF(并考虑使用通用函数)的示例

If master("one") <> import("one") Or _
   master("two") <> import("two") Or _
   master("date") <> import("date") Or _  //import("date") comes from a spreadsheet, it comes in as string, CAN be a null value
   master("qty") <> import("qty") Or _    //import("qty") comes from spreadsheet, comes in as a string can CAN be null
   master("etc") <> import("etc") Then

....stuff....

End If

该代码扩展了大约20列以在数据库中进行比较。我希望作为声明的一部分进行检查。我可以想到一堆解决方案,但它们涉及添加更多代码。如果是这样的情况,但是我不是一个容易屈服的人。

我看到的选项是

  • 在比较和使用这些新的var而不是记录集之前,创建温度vars来完成工作
  • 创建一个将记录传递到Preformat并使用的对象,尽管额外的工作将为每种导入类型提供此功能,因为有不同的文件具有相似的字段

我在这里寻求创意,并且我对任何有趣的作品都开放,这些作品可以决定如何做到这一点,我正在寻找最可重复使用的方法。

有帮助吗?

解决方案

将值更改为字符串的简单权宜之计极大地有助于。诀窍是修剪一个为null的字符串将获得一个空字符串。然后可以像不是数据库null一样操作。
我经常使用该表格:

CInt("0" & Trim(SomeVariant & " "))

要获得一个有效的数字,而无需经过一堆Hijinks。零是这个问题的无效。

其他提示

您描述的行为是IIF在VBA下运行的标准方式。这是Access 2003帮助所说的一部分:

"iif 总是评估两者 truepart假单单, ,即使它仅返回其中一个。因此,您应该注意不良的副作用。例如,如果评估 假单单 导致零错误的划分,即使 Expr真的."

但是,如果您在查询中使用IIF语句,则在此之后评估短路 truepart 什么时候 Expr真的 --- 假单单 在这种情况下未评估。不幸的是,此信息对您没有用...除非您可以将查询纳入比较。

我不知道有任何其他方法可以避免您对IIF的错误。我将尝试将Excel数据附加到一个表中,该表与您将要比较的表的结构与表的结构匹配,从而消除了在进行比较的同时进行字符串转换的需求。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top