我正在用头撞墙。我正在查看一些用 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!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
当is时抛出“Invalid use of Null”错误Null
,但是
?Str(rsSource!VehYear.Value)
返回Null
。
但是,两者Trim(rsSource!VehYear)
都Trim(rsSource!VehYear.Value)
返回Null
。