Mik*_*oss 6 vb6 adodb type-conversion
我正在敲打这个墙上的头.我正在查看一些用VB6编写的旧数据库报告代码,并且遇到了这一行(代码将数据从"源"数据库移动到报告数据库中):
rsTarget!VehYear = Trim(Str(rsSource!VehYear))
Run Code Online (Sandbox Code Playgroud)
当rsSource!VehYear是Null,上面的行产生一个"无效使用Null"运行时错误.如果我在上面的行中断并在"立即"窗格中键入以下内容:
?rsSource!VehYear
Run Code Online (Sandbox Code Playgroud)
它输出Null.很好,这很有道理.接下来,我尝试重现错误:
?Str(rsSource!VehYear)
Run Code Online (Sandbox Code Playgroud)
我得到"无效使用Null"错误.
但是,如果我在立即窗口中键入以下内容:
?Str(Null)
Run Code Online (Sandbox Code Playgroud)
我没有收到错误.它只是输出Null.
如果我重复相同的实验Trim()而不是Str(),一切正常.?Trim(rsSource!VehYear)和返回Null一样?Trim(Null).没有运行时错误.
所以,我的问题是,如何才能Str(rsSource!VehYear)有可能抛出一个"无效使用的Null"错误时Str(Null)不,当我知道那rsSource!VehYear是等于Null?
更新:如果我在立即窗口中键入以下内容,它按预期工作(没有错误发生):
?Str(rsSource!VehYear.Value)
Run Code Online (Sandbox Code Playgroud)
这输出Null.现在,我知道这rsSource!VehYear实际上是一个ADODB.Field实例,但Value它是默认属性,因此Str应该在Value属性上运行(即Null).甚至错误消息("无效使用空")表明Str正在接收一个Null参数,但它如何Null在一种情况下区别对待而不是另一种情况?
我唯一的猜测是内部执行的Str()是不知何故未能获得默认属性,"无效的使用Null"错误发生的原因不同(除了参数以外的其他原因造成的"无效使用空的",也许当它试图从Field对象中检索默认属性).
有没有人对这里发生的事情有更详细的技术解释?
简而言之:
?Str(rsSource!VehYear)
Run Code Online (Sandbox Code Playgroud)
当抛出一个"无效使用的Null"错误rsSource!VehYear的Null,但
?Str(rsSource!VehYear.Value)
Run Code Online (Sandbox Code Playgroud)
回报Null.
然而,无论是Trim(rsSource!VehYear)和Trim(rsSource!VehYear.Value)返回Null.
小智 7
如果您需要除字符串以外的值,请尝试使用IsNull:
rsTarget!VehYear = IIf(IsNull(rsSource!VehYear), 0, rsSource!VehYear)
Run Code Online (Sandbox Code Playgroud)
'注0是默认值
Str函数将专门检查是否传入Null值并相应地处理它.传入对象时,它会尝试将默认方法的结果转换为String.默认方法的结果不会传递给Str方法,但是Field对象是,因此检查初始Null将失败.当Str函数意识到它有一个对象时,它将继续检查它支持的数据类型的参数类型,它将尝试检索默认值.它不会像传入的参数那样重新尝试处理默认值,因此将Null作为String返回的尝试将失败.似乎MS没想到默认值为Null或Str的任何其他无效值.例如,Str也不支持空字符串.