在所有情况下,无论本地化或数据库格式如何,True 都不是 FALSE 或 NOT 0。
因此,如果您将 True 的所有测试替换为 NOT 0,将 False 的所有测试替换为 =0,那么您就避免了 Access 关键字的本地化问题(令我惊讶的是,VBA 以及 Jet 和 Access 表达式服务不会但仍然理解 True/False),以及数据库引擎用于存储布尔值的任何约定。
一般来说,您的数据访问层应该为您抽象出来。根据我的经验,ODBC 和 ADO 都会自动执行此操作,因此您可以使用您知道的布尔值,并且它会以透明的方式为您处理。
我仍然对这个问题感到困惑,因为它听起来像是显示/格式问题,但对 True 和 False 使用 NOT 0 和 =0 可以在所有情况下完全避免该问题。
编辑:关于编辑为菲利普问题的功能:
您将函数的参数隐式定义为变体是否有原因?你是这个意思吗?如果传递的是 Null,则第一个 CInt() 会出错,因为 CInt() 不能接受 Null。
另外,还有一个逻辑问题,在 VBA 中,除 0 之外的任何数字都应该返回 True。这也是完全冗余的代码。这更简单,并且在所有情况下都会返回正确的结果:
Function xBoolean(xLocalBooleanValue As Vriant) as Boolean
If CInt(xLocalBooleanValue) <> 0 Then
xBoolean = True
End If
End Function
或者,更简洁一点:
Function xBoolean(xLocalBooleanValue As Variant) as Boolean
xBoolean = (CInt(xLocalBooleanValue) <> 0)
End Function
并处理参数中传递的空值:
Function xBoolean(xLocalBooleanValue As Variant) as Boolean
xBoolean = (CInt(Nz(xLocalBooleanValue, 0)) <> 0)
End Function
我不确定这在您当前使用它的上下文中是否必要,但我总是讨厌编写代码,因为我可以想象它会出错的情况 - 即使我知道它在当前上下文中无法中断,你永远不知道它最终会在哪里使用,所以如果你预见到可以处理的情况,你应该处理它。
过早优化?
不——它是在武器上加一个安全锁,以防止其被滥用。
(另一方面,如果需要更多行代码来处理预期的错误,那么函数开始时,我会三思而后行)