Office中国论坛/Access中国论坛

标题: 重大发现,应该是ACCESS的漏洞,绝对是的(DIM 语句赋值) [打印本页]

作者: today416    时间: 2011-8-1 22:40
标题: 重大发现,应该是ACCESS的漏洞,绝对是的(DIM 语句赋值)
真的是重大发现。用 dim 语句定义变量时,如果同时用一个DIM定义多个变量时,会造成空值错误。什么意思呢。我刚研究了半天,发现了以下规律:

如果同时DIM多个字符变量,那么最后一个变量系统会自动赋值为空字符串 “” ,而前面的几个变量为自动赋值为 NULL. 
举例:
dim a,b,c,d,e as string  ‘那么 a,b,c,d 系统赋值为NULL 而e 则为“”
dim a,b,c,d as string         ‘那么 a,b,c系统赋值为NULL 而d 则为“”
dim a,b,c as string            ‘那么 a,b系统赋值为NULL 而c 则为“”
dim a,b as string            ‘那么 a系统赋值为NULL 而b 则为“”
dim a as string            ‘那么 a 系统赋值为“” ,因为只有一个,所以也是最后一个。

实际中会造成什么情况呢?
假如你一次定义了a,b,c,d,e 5个变量,同时将窗体的文本框1,2,3,4,5的值分别赋值于a,b,c,d,e,而且假设这五个文本框的值都为空(不为空的话则不会出现错误),代码如下
dim a,b,c,d,e as string
a=me.文本框1
b=me.文本框2
c=me.文本框3
d=me.文本框4
e=me.文本框5

运行代码,你会发现,其中a,b,c,d 四个变量都可以正常赋值,也就是系统会将NULL值赋于a,b,c,d。 但是运行到               e=me.文本框5   则会出现错误。的确是这样的。不信大家试试。

另外本人操作系统XP,access是2003.如果跟版本没关系那就的确是微软的问题了



作者: 红尘如烟    时间: 2011-8-2 00:41
楼主连最基本的语法都没弄明白,String型的变量赋值为Null的时候本来就应该出错,因为所赋的值超出了变量的允许范围,不出错才奇怪了
作者: 咱家是猫    时间: 2011-8-2 08:57
dim a,b,c,d,e as string  
就这个语句来说,你以为最后把e声明为string后,前面的a,b,c,d全部都自动为string类型了吗?
呵...关键点就在这里.纯属楼主意念之差.
作者: tmtony    时间: 2011-8-2 09:54
dim as string,b as string ,c as string ,d as string,e as string  
作者: roych    时间: 2011-8-2 11:05
对于类型不确定的变量,可以先不定义类型。例如可以这样:
Dim a,b,c,d,e
作者: todaynew    时间: 2011-8-2 11:11
本帖最后由 todaynew 于 2011-8-2 11:15 编辑
today416 发表于 2011-8-1 22:40
真的是重大发现。用 dim 语句定义变量时,如果同时用一个DIM定义多个变量时,会造成空值错误。什么意思呢。 ...

坚决参与today416同志的批斗会!

dim a,b,c,d,e as string 等同于如下语句: dim a Variant,b as Variant,c as Variant,d as Variant,e as string

Variant 数据类型是所有没被显式声明(用如 Dim、Private、Public 或 Static等语句)为其他类型变量的数据类型。Variant 数据类型并没有类型声明字符。

Variant 是一种特殊的数据类型,除了定长 String 数据及用户定义类型外,可以包含任何种类的数据。Variant 也可以包含 Empty、Error、Nothing 及 Null等特殊值。可以用 VarType 函数或 TypeName 函数来决定如何处理 Variant 中的数据。



作者: fekin    时间: 2011-8-2 12:17


喜欢这种帖子,动脑筋啊
作者: tmtony    时间: 2011-8-2 12:55
todaynew 发表于 2011-8-2 11:11
坚决参与today416同志的批斗会!

dim a,b,c,d,e as string 等同于如下语句: dim a Variant,b as V ...

老汉,别批斗了 , 看today416的网名,约摸500年前与你是一家啊,你这一吓,today416都不敢露面了
作者: huangqinyong    时间: 2011-8-2 12:58
tmtony 发表于 2011-8-2 12:55
老汉,别批斗了 , 看today416的网名,约摸500年前与你是一家啊,你这一吓,today416都不敢露面了

赞同王站的观点,对初学者宽容些吧
作者: roych    时间: 2011-8-2 13:17
huangqinyong 发表于 2011-8-2 12:58
赞同王站的观点,对初学者宽容些吧

挺老汉!高级会员了还“初学者”?这只能说明根本没花时间去思考或学习。
作者: ycxchen    时间: 2011-8-2 15:19
tmtony 发表于 2011-8-2 12:55
老汉,别批斗了 , 看today416的网名,约摸500年前与你是一家啊,你这一吓,today416都不敢露面了

同意,楼主应该是不断学习ACCESS操作而成为高级会员,但对ACCESS  VBA接触少,是初学者,出发点是好的。
作者: today416    时间: 2011-8-2 17:49
dim a,b,c,d,e as string 等同于如下语句: dim a Variant,b as Variant,c as Variant,d as Variant,e as string
-----------------------------------------------
悲剧啊,原来是这样.亏我这几年都是这样来DIM的,难怪老出现莫名其妙的问题

作者: today416    时间: 2011-8-2 17:53
这样说来dim a,b,c,d,e as long   a,b,c,d都是Variant,只有e才是真正的long ?
作者: todaynew    时间: 2011-8-2 18:01
today416 发表于 2011-8-2 17:53
这样说来dim a,b,c,d,e as long   a,b,c,d都是Variant,只有e才是真正的long ?

Yes
作者: 轻风    时间: 2011-8-3 09:47
咳、咳,批归批,楼主的学习精神还是可佳的,批完可表扬一下。
作者: zhuyiwen    时间: 2011-8-4 00:46
其实一叶障目,时而有之。
不过,dim a,b,c,d,e as string  ‘那么 a,b,c,d 系统赋值为NULL 而e 则为“”,本身是一道VBA的经典题目。





欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3