代码之家  ›  专栏  ›  技术社区  ›  Philippe Grondier

MS Access本地化和默认布尔值

  •  3
  • Philippe Grondier  · 技术社区  · 16 年前

    我们的访问客户机会即时生成要在MS-SQL服务器上发送的SQL插入、更新和删除指令。大多数用户使用的是运行时版本的Access2007,少数用户使用的是完整的MS Access版本2003或2007。今天早上,我们在国外的一个新用户使用法国/完整版本的Access2003,无法更新包含布尔字段的数据。

    在法国版的access中,这些字段似乎填充了“vrai/faux”而不是“true/false”值。通过安装2007 Access运行时解决了该问题。

    但我想找到一个永久性的解决方案,我可以从某个地方读取正在使用本地化版本的访问,并将本地化的真/假值“翻译”为标准的真/假。我已经检查了计算机的区域设置,但没有成功,所以它在其他地方。有什么想法吗?

    编辑:根据johnfx建议,使用此简单函数可以有效地从本地真/假转换为通用真/假:

    Function xBoolean(xLocalBooleanValue) as Boolean
    if cint(xLocalBooleanValue) = -1 Then
        xBoolean = True
    endif
    if cint(xLocalBooleanValue) = 0 Then
        xBoolean = False
    endif
    end function
    

    编辑:根据@david的评论,我更改了最喜欢的解决方案。他的建议比我的更明智。

    编辑:我通过读取记录集中字段的值来获取vrai/faux值:

    ? debug.print screen.activeForm.recordset.fields(myBooleanField).value 
    Vrai
    
    3 回复  |  直到 15 年前
        1
  •  2
  •   David-W-Fenton    16 年前

    无论是本地化还是数据库格式,在任何情况下,true都不是false,也不是0。

    因此,如果将所有“真”测试替换为“非0”,将所有“假”测试替换为“0”,那么就避免了访问关键字的本地化问题(但令我惊讶的是,VBA、Jet和Access Expression Services仍然无法理解“真/假”),以及数据库引擎用于存储布尔值的任何约定。S.

    一般来说,您的数据访问层应该为您将其抽象化。ODBC和ADO都是自动完成的,所以你可以使用你知道的布尔值,在我的经验中,它对你的处理是透明的。

    我仍然对这个问题感到困惑,因为它听起来像是一个显示/格式化问题,但是使用非0和=0表示“真”和“假”可以完全避免所有情况下的问题。

    编辑:关于编辑成菲利普问题的功能:

    是否存在将函数参数隐式定义为变量的原因?这就是你的意思吗?如果它传递了一个空值,那么第一个cint()就会出错,因为cint()不能接受空值。

    而且,在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
    

    我不确定在您当前使用它的上下文中是否有必要这样做,但我始终不喜欢编写代码,在这种情况下,我可以想象它会出错——即使我知道它不能在当前上下文中中断,您永远不知道它可能在何处使用,因此,如果您预期一个可以处理的条件,您应该处理它。

    过早优化?

    不——这是在武器上安全锁,以防被误用。

    (另一方面,如果处理反向错误所用的代码行数比函数开始时所用的代码多,我会仔细考虑一下)

        2
  •  1
  •   JohnFx    16 年前

    您是否考虑在更新和删除查询中使用-1/0(访问对于布尔值很奇怪)而不是true/false?

    数学是通用语言,雅克诺。

    另外,为了避免对UI进行如此多的本地化,为什么不使用复选框而不是文本字段来显示UI上的布尔值呢?

        3
  •  0
  •   DarkSprout    15 年前

    简单:

    Function xBoolean(bool As Variant) As Boolean
        xBoolean = Abs(Nz(bool, 0))
    End Function
    
    推荐文章