我正在用头撞墙。我正在查看一些用 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, 一样?Trim(Null). 没有运行时错误。
所以,我的问题是,当我知道等于时,怎么Str(rsSource!VehYear)可能抛出“无效使用 Null”错误?Str(Null)rsSource!VehYearNull
更新:如果我在“立即”窗口中键入以下内容,它会按预期工作(不会发生错误):
?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当is时抛出“Invalid use of Null”错误Null,但是
?Str(rsSource!VehYear.Value)
返回Null。
但是,两者Trim(rsSource!VehYear)都Trim(rsSource!VehYear.Value)返回Null。