7

我正在用头撞墙。我正在查看一些用 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

4

4 回答 4

8

如果您需要字符串以外的值,请尝试使用 IsNull 代替:

rsTarget!VehYear = IIf(IsNull(rsSource!VehYear), 0, rsSource!VehYear)

' 注意0是默认值

于 2012-02-19T22:54:31.637 回答
6

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

于 2010-05-11T13:51:54.053 回答
1

这是我在 vb6 天的解决方法:

rsTarget!VehYear = Trim(Str(rsSource!VehYear & "")) 

&""将确保至少有一个空字符串可以使用。

于 2010-05-06T23:13:55.157 回答
0

从内存中,空数据库字段是Nothing(或可能vbNull),它们与应用的规则不同Null。您应该能够进行快速检查:

If (rsSource!VehYear Is Nothing) Then
    ' Null
Else
    ' Not null
End If
于 2010-05-06T22:47:44.313 回答