加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

vb6 – 使用带有Null Recordset字段的Str()时“无效使用Null”,

发布时间:2020-12-17 00:25:57 所属栏目:大数据 来源:网络整理
导读:我正在敲打这个墙上的头.我正在查看一些用VB6编写的旧数据库报告代码,并且遇到了这一行(代码将数据从“源”数据库移动到报告数据库中): rsTarget!VehYear = Trim(Str(rsSource!VehYear)) 当rsSource!VehYear为Null时,上面的行会生成“无效使用Null”运行时
我正在敲打这个墙上的头.我正在查看一些用VB6编写的旧数据库报告代码,并且遇到了这一行(代码将数据从“源”数据库移动到报告数据库中):
rsTarget!VehYear = Trim(Str(rsSource!VehYear))

当rsSource!VehYear为Null时,上面的行会生成“无效使用Null”运行时错误.如果我在上面的行中断并在“立即”窗格中键入以下内容:

?rsSource!VehYear

它输出Null.很好,这很有道理.接下来,我尝试重现错误:

?Str(rsSource!VehYear)

我得到“无效使用Null”错误.

但是,如果我在立即窗口中键入以下内容:

?Str(Null)

我没有收到错误.它只是输出Null.

如果我用Trim()而不是Str()重复相同的实验,一切正常. ?Trim(rsSource!VehYear)返回Null,修复(Null).没有运行时错误.

所以,我的问题是,当Str(Null)没有时,Str(rsSource!VehYear)怎么可能抛出“无效使用Null”错误,当我知道rsSource!VehYear等于Null时?

更新:如果我在立即窗口中键入以下内容,它按预期工作(没有错误发生):

?Str(rsSource!VehYear.Value)

这输出Null.现在,我知道rsSource!VehYear实际上是一个ADODB.Field实例,但Value是它的默认属性,因此Str应该在Value属性(Null)上运行.即使错误消息(“无效使用Null”)也表明Str正在接收Null参数,但是如何在一种情况下以不同的方式处理Null?

我唯一的猜测是Str()的内部实现以某种方式无法获取默认属性,并且“无效使用Null”错误发生的原因不同(除了参数之外的其他因素导致“无效使用Null”),也许当它试图从Field对象中检索默认属性时).

有没有人对这里发生的事情有更详细的技术解释?

简而言之:

?Str(rsSource!VehYear)

当rsSource!VehYear为Null时抛出“无效使用Null”错误,但是

?Str(rsSource!VehYear.Value)

返回Null.

但是,Trim(rsSource!VehYear)和Trim(rsSource!VehYear.Value)都返回Null.

Str函数将专门检查是否传入Null值并相应地处理它.传入对象时,它会尝试将默认方法的结果转换为String.默认方法的结果不会传递给Str方法,但是Field对象是,因此检查初始Null将失败.当Str函数意识到它有一个对象时,它将继续检查它支持的数据类型的参数类型,它将尝试检索默认值.它不会像传入的参数那样重新尝试处理默认值,因此将Null作为String返回的尝试将失败.似乎MS没想到默认值为Null或Str的任何其他无效值.例如,Str也不支持空字符串.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读