(1)看来楼主还是不习惯封装函数哦,我说的那个函数AsString 就是封装了,供你在做这种编码时用的啊:
if (Len(AsString(RST.FIELDS("姓名")) = 0) then '直接判断长度快些
if (AsString(RST.FIELDS("姓名")) = vbNullString) then
if (AsString(RST.FIELDS("姓名")) ="") then '要分配一个空字符串,慢些
当然,我的AsString是通过赋值加异常处理实现的,你用ISNULL,ISEMPTY,TypeName等综合处理也是可以的
首先需要明确的是,Null和Empty均只对Variant数据类型有效,而Variant数据类型在内存中占16个字节,其中前两个字节表示Variant数据类型的实际类型,中间6个字节保留,最后8个字节为数据域,为指针或实际数据的联合体。
(1)当Variant变量值为Null时,它表示Variant变量的实际类型为VT_NULL(常量1),数据域的指针指向的无效区域(指针值可能为0也可能不为0),经常用来与表示数据表包含Null的字段值。IsNull函数实际检测Variant变量的前2个字节,即Variant结构体中的VT成员。
(2)当Variant变量为Empty时,它表示Variant结构体中的前2个字节(即VT成员)值为VT_EMPTY(常量0),即Variant结构体的16个字节均为0,以此作为变量是否被赋值或初始化的依据。
(3)至于VB的字节串,与标准C的CHAR字符串不一样的是,它是一个自包含串长度的WCHAR类型的字符串,假设有以下代码:
Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (Destination As Any, Source As Any, ByVal Length As Long)
Sub main()
Dim s As String
Dim nLen As Long
s = "abcd"
CopyMemory nLen, ByVal StrPtr(s) - 4, 4
Debug.Print nLen
End Sub
运行后可以看出,nLen值为8。为什么是8呢,因为VB字符串为WCHAR字符串嘛,即不管中英文,所有字符均用两个字节表示。
实际上,VB字符串在内存中的布局可以用以下结构体包含:
Type BSTR
Length As Long
Text(Length - 1) As Byte
End Type
而字符串变量实际上是一个指针,它指向的地址不是Length,而是Text,当指针值为vbNullString时,表示字符串变量没有申请和指向任何内存,当变量值为""时,表示字符串变量申请了内存,但该内存中的Length成员为0,Text为空。因此,vbNullString表示空指针,其StrPtr值为0,而0长度字符串的StrPtr值不为0。