3

记录集中的项目 rstImportData("Flat Size") is = 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

它返回 Null,因为它应该是第一次。如果传入的值应该为 null,即使它通过了 IIF 测试,我似乎也无法在 IIF 中进行类型转换,它仍会尝试在真假答案中对其进行评估。我像这样使用 IIF 的唯一原因是因为我有 25 行比较来比较 Import 中的数据与数据库中的匹配记录,以查看是否需要附加之前的历史记录。

有什么想法吗?导入数据的方式将有空日期,并且电子表格导入为字符串格式,我必须将任一侧转换为另一侧以正确比较值,但如果任一侧为空,则会发生此异常:(

编辑 我为什么使用 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 列以在数据库中进行比较。我更愿意检查作为声明的一部分。我可以想到一堆解决方案,但它们涉及添加更多代码。如果是这样的话,我也不是那么容易屈服的人。

我看到的选项是

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

我来这里是为了想法,我对任何有趣的作品持开放态度,因为我决定如何去做我正在寻找最可重用的方法。

4

2 回答 2

3

您描述的行为是 IIf 在 VBA 下运行的标准方式。这是 Access 2003 帮助中关于它的部分内容:

" IIf总是同时计算truepartfalsepart,即使它只返回其中一个。因此,您应该注意不良副作用。例如,如果计算 falsepart导致除以零错误,即使expr也会发生错误是真的。”

但是,如果您在查询中使用 IIf 语句,则当exprTrue时,在truepart之后评估会短路——在这种情况下不会评估falsepart 。不幸的是,此信息对您没有用...除非您可以将查询合并到您的比较中。

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

于 2010-04-30T23:03:36.327 回答
3

将值更改为字符串的简单权宜之计有很大帮助。诀窍是修剪一个为 NULL 的字符串将得到一个空字符串。然后可以对其进行操作,就好像它不是数据库空值一样。
我经常使用这种形式:

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

获得一个有效的号码,而不必经历一堆麻烦。对于这个问题,null 是一个非实体。

于 2010-04-30T23:42:32.757 回答