VBA ADODB 记录集字段是来自 MySQL 的 Null - 有没有简单的方法来检查或防止“NULL”?

Posted

技术标签:

【中文标题】VBA ADODB 记录集字段是来自 MySQL 的 Null - 有没有简单的方法来检查或防止“NULL”?【英文标题】:VBA ADODB recordset field is Null from MySQL - is there an easy way to check or prevent "NULL"? 【发布时间】:2018-10-19 06:49:48 【问题描述】:

我从 mysql 服务器中提取了一个大型记录集,并根据字段位置在 Excel VBA 例程中分配了一堆变量,例如:

x = MyRecordset.Fields(0).Value
y = MyRecordset.Fields(1).Value
' etc...

只有当其中一个值为 NULL 时才会引发错误,因为 VBA 不允许字符串为 NULL。如果 VBA 端倒下,我对 VBA 和 MySQL 端都有疑问:

VBA:我目前正在使用On Error Resume Next 来跳过 NULL 错误 - 有没有更好/更正式的方法来实现这一点?这个错误是否跳过减慢我的代码?

MySQL: 有没有办法防止“NULL”被发送,例如在我的SELECT 语句中用空字符串快速替换 NULL 实例?

【问题讨论】:

您是否尝试在查询中使用“IS NOT NULL”? ***.com/questions/5285448/… 那只会给我在任何字段中不包含 NULL 值的行,对吗?我仍然想要那些行,我只想将一两个 NULL 实例替换为 "" 也许我只需要不允许我的数据库中的任何 NULL 值以开头并将所有内容默认为空字符串... 为什么不先检查IsNull(MyRecordset.Fields(0).Value),然后再检查x = MyRecordset.Fields(0).Value 【参考方案1】:

使用类似的函数

Option Explicit

Function rcdString(rcdField As Variant) As String

    If IsNull(rcdField) Then
        rcdString = ""
    Else
        rcdString = rcdField.Value
    End If

End Function

x = rcdString(MyRecordset.Fields(0))

【讨论】:

谢谢,我会接受这个,我有一个类似同类函数的转换模块,所以我认为这很适合那个工具箱。【参考方案2】:

如何做到这一点:

1 - 在 VBA 端

如果我没记错的话,已经有一个 VBA 函数可以将空值转换为默认值。在你的情况下,那将是

Nz(MyRecordset.Fields(1).Value,"")

如果字段值为空,则返回零长度字符串。

2 - 在 MYSQL 方面

您可以使用 COALESCE 函数,该函数将返回其参数列表中的第一个非空值。您的选择将如下所示:

SELECT COALESCE(myFieldName,'') 

【讨论】:

您好,感谢您的输入,Nz() 函数显然只在 Access 中有效,而我正在使用 Excel - 不过很有帮助,因为我搜索了它并且看到了一个很好的 sn-p根据IIF() 重新创建它 - 至于COALESCE() 的想法,也很棒,我将使用两者进行一些速度测试,看看哪个更快 - 我认为 Excel 中的后查询处理可能会更快,并将用户应用程序而不是服务器上的“CPU”负担。【参考方案3】:

如果我没记错的话,如果你有一个可能为空的变量,连接一个空字符串会将变量变成一个空字符串,而不会影响任何其他值。但这可能不适用于 ADO 记录集

 x = MyRecordset.Fields(0).Value & ""

【讨论】:

以上是关于VBA ADODB 记录集字段是来自 MySQL 的 Null - 有没有简单的方法来检查或防止“NULL”?的主要内容,如果未能解决你的问题,请参考以下文章

在 VBA 中对断开连接的 ADODB 记录集应用过滤器

Excel VBA - 搜索范围和连接的 SQL ADODB 记录集以在列中匹配写入结果集

从ADODB记录集复制数据时,Excel表丢失数字格式

vba adodb参数查询失败

使用 vba 在 MS-Access 前端中来自 MySQL 存储过程的多个结果集?

VBA - ADODB.Connection - 使用参数和检索受影响的记录数