【问题标题】:Access: Data Type Mismatch using boolean function in query criteria访问:在查询条件中使用布尔函数的数据类型不匹配
【发布时间】:2010-06-16 01:24:40
【问题描述】:

我有一个返回布尔值的 VBA 函数 IsValidEmail()。我有一个调用此函数的查询:Expr1: IsValidEmail([E-Mail])。当我运行查询时,它显示 -1 表示 True,0 表示 False。到目前为止一切顺利。

现在我想过滤查询以仅显示无效电子邮件。我正在使用查询设计器,所以我只需将 0 的值添加到 Criteria 字段。这给了我一个“数据类型不匹配”错误。 "0"(带引号)和 False 也是如此。我应该如何为布尔函数指定条件?

【问题讨论】:

    标签: ms-access ms-access-2007 vba


    【解决方案1】:

    对于布尔列,“0”肯定会给您“条件表达式中的数据类型不匹配”错误。但是,不带引号的 0 或 False 应该可以工作。我不明白他们为什么会产生同样的错误。

    看看您是否可以通过直接编辑 SQL 来生成有效的查询。创建一个新查询,切换到 SQL 视图并粘贴到此语句中(将 YourTableName 替换为您的表的名称)。

    SELECT IsValidEmail([E-Mail]) AS valid_email
    FROM YourTableName
    WHERE IsValidEmail([E-Mail]) = False;
    

    当您以这种方式创建查询时,您的查询是否会正常运行?

    更新:由于该查询也产生了同样的错误,我只能建议在没有任何条件的情况下尝试这个。

    SELECT
        IsValidEmail([E-Mail]) AS valid_email,
        TypeName(IsValidEmail([E-Mail])) AS type_of_valid_email
    FROM YourTableName;
    

    但是,这似乎是一个很长的尝试,因为您已经告诉我们您之前没有标准的尝试运行没有错误。如果这不能确定问题,您会考虑通过电子邮件向我发送您的数据库的精简副本吗?如果您有兴趣,请告诉我,我会给您我的电子邮件地址。

    【讨论】:

    • 我将您的查询复制/粘贴到 SQL 视图中,更改了表名,然后执行。同样的错误。
    • 我在模拟发送给您的示例时发现了这一点。谢谢!
    【解决方案2】:

    该错误是由于我的表中的某些记录的电子邮件为空而引起的。我的查询具有排除空电子邮件记录的 where 条件,因此当我在 IsValidEmail 列上没有条件运行它时,我的函数仅针对具有非空电子邮件的记录调用。但是,当我在 IsValidEmail 上添加条件时,它会为每条记录调用该函数,并且错误来自尝试将 null 传递给期望字符串的函数。

    另一种说法:

    SELECT [E-Mail],
           IsValidEmail([E-Mail]) <--Executed only for rows matching where clause
    FROM   Contacts
    WHERE  IsValidEmail([E-Mail]) = False; <-- Gets executed for all rows
    

    将我的查询表达式从 IsValidEmail([E-Mail]) 更改为 IsValidEmail(nz([E-Mail],"X")) 解决了这个问题。

    【讨论】:

    • 我打算建议您检查 IsValidEmail() 的定义,以便它肯定返回布尔值而不是变体。如果它被定义为 Public Function IsValidEmail(...) 它应该更改为 Public Function IsValidEmail(...) As Boolean。您还可以将其更改为对传递的电子邮件地址使用变体,以便它可以在内部处理 Null,而无需为传递给它的每一行调用 Nz()。这还可以添加一个可选参数,让您可以选择将 Null 电子邮件视为有效还是无效。
    • ...继续说下去,对我来说,Null 电子邮件不是无效的电子邮件地址,只是缺少一个,这不是一回事。但是您是否同意取决于您如何使用它。顺便说一句,解析电子邮件地址的有效性实际上是一个相当复杂的过程,即使它的文本格式正确,也并不意味着它实际上是一个有效地址,因为它不会被退回。
    • @Fenton:感谢您的反馈。我正在寻找一种通过函数(明确定义为布尔值)接受空值并在内部处理它们的方法。我将实施您的变体参数方法。而且我很清楚电子邮件地址验证的复杂性——关于这个问题已经有足够多的问题了,所以我不打算在这里讨论。
    猜你喜欢
    • 1970-01-01
    • 2011-11-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多