定义记录集的技术问题?困惑一段时间了.
有以下两种方式,
1.dim rs as adodb.recordset
2.dim rs as new adodb.recordset
其中第一种在定义时不生成对象,到使用时还要执行:set rs=new adodb.recordset才行.
而第二种在定义时就会生成ado对象,不知两种方法哪种好些,各应用在哪种情况下.
另外我主要想问的是以下这个问题:
比如在一个按钮的单击事件中,要进行数据库的各种操作,要反复用到ado对象rs,不论用以上哪种方法定义,则第一次打开记录集时创建了对象,下次再用这个rs打开不同的内容时,是先关了记录集再打开好呀?还是再执行一次:set rs=new adodb.recordset好呀(前提是rs已经存在,如果先close再open,我觉得还不如用set rs=new adodb.recordset快捷,不知这种做法可以吗?)
有以下两种方式,
1.dim rs as adodb.recordset
2.dim rs as new adodb.recordset
其中第一种在定义时不生成对象,到使用时还要执行:set rs=new adodb.recordset才行.
而第二种在定义时就会生成ado对象,不知两种方法哪种好些,各应用在哪种情况下.
另外我主要想问的是以下这个问题:
比如在一个按钮的单击事件中,要进行数据库的各种操作,要反复用到ado对象rs,不论用以上哪种方法定义,则第一次打开记录集时创建了对象,下次再用这个rs打开不同的内容时,是先关了记录集再打开好呀?还是再执行一次:set rs=new adodb.recordset好呀(前提是rs已经存在,如果先close再open,我觉得还不如用set rs=new adodb.recordset快捷,不知这种做法可以吗?)
也可能我没说明白,我主要是想问,如果一个记录集打开了,我如果想再次执行open,我就必须关闭后才行再次打开,可是我不想这么做,因为太麻烦,我想每次open之前,都进行set r=new adodb.recordset这种办法,就避免了关闭记录集然后再次打开记录集(open)的代码,只不过不知道这种做法好不好,我试过,不报错.我担心的是会不会这样将打开多个记录集而不会释放,一直占着内存呀?即每次set rs=new adodb.recordset都会生成一个新的记录集.
谢谢
要是你每次不set r = nothing的话
你使用了100次就实例化了100个r
你的内存里面回占资源的
要是你每次不set r = nothing的话
你使用了100次就实例化了100个r
你的内存里面回占资源的
----------------
谢谢回复,比如实例了100个,可是只有最后一个可以被引用,是这个意思吗?也就是说那99个是无法引用了,只会占内存吗?如果不是这样,那99个能过什么方法来引用呢?
我实例的这100个都是对应同一个记录集名字r呀?我以前的理解是新的实例覆盖旧实例.难道我的理解真的错误吗?
如果这样,那么set r=new adodb.recordset就只能用一句了,是不是呀?
1.dim rs as adodb.recordset
2.dim rs as new adodb.recordset
都可以,只是第一种先定义结果集对象,而没有实例化,当然也没有分配内存空间,等要用到结果集时再实例化,再分配内存空间,用完就close 或 set mrc=nothing 都可以。
第二种在定义的时候实例化,同时也分配内存。
本人强烈建议每一种方法。等用时再实例化。 个人想法,仅供参考!:)
1.比如在个按钮的单击事件,如果实例化了一个对象,是不是必须用代码set rs=nothing才能真正释放这个对象呀?还是执行完单击事件这个对象就自动释放内存了,前提我定义的是 dim rs as adodb.recordset
2.我只做set rs=nothing,而不做rs.close,或是只做rs.close而不做set rs=nothing,是不是都不会真正释放对象呀?必须两句都写,缺一不可吗?并不是想偷懒,而是想明白一个道理.
再次表示感谢.
每用Object变量绑定一个对象的时候,对象的引用计数会加1
每将一个Object变量设为Nothing时,原Object指向的对象的引用计数会减1
当对象的引用计数减到0时,对象会释放这是COM对象的引用计数机制,VB中的对象实质上是COM对象
所以想把VB对象机制弄清楚的话,得学COM当离开变量作用域时,VB会将Object变量自动设为Nothing
但是有时会出现这样问题:若不在合适的时候取消对象引用(将Object变量设Nothing),对象不能正常释放
所以最好养成自己将Object变量设Nothing的好习惯
dim rs as adodb.recordset这句只是定义一个记录集对象还没实例化,可以说是定义了一个记录集的类
set rs =new adodb.recordset这句后就把这个变量实例化了,这时就可以使用adodb.recordset类的接口了,如果定义之后在不set rs =new adodb.recordset的情况下再次使用这个rs去open的话则会报错,这句如果多次使用而不close的话则每句都生成一个adodb.recordset类的实例.而用dim rs as new adodb.recordset的话,可以认为是在定义adodb.recordset这个记录集类时同时实例化rs,这时实例不关闭的话再次使用rs去open则会报错,但用set rs = new adodb.recordset仍然可以再次定义一个adodb.recordset类的实例所以,两者之间并没有什么大的区别
当对象释放的时候会调用对象的析构方法释放资源,比如recordset会调用自身的close方法VB的ADO对象实际上是扮演一个中介商的角色
当有客户通过中介商访问商品时(有引用计数),中介商会向厂家调货
当没有用户需要中介商时(引用计数减到0),中介商会倒闭(对象释放),向厂家解除合约(.close)
当用户发现再也不需要利用中介商时,可以强迫其向厂家解除合约(.close),再强行关闭(set rs=nothing)
还有:conn.close之后还必须set conn=nothing吗?如果必须加上set conn=nothing,又是因为什么呢?因为conn.close是强行关闭连接对象呀?
谢谢老师们.
在离开变量作用域时,VB会自动释放这样的对象
只不过为了养成良好的习惯,建议手动释放(set conn=nothing)
直到你再次调用.open,对象才有意义也就是说,.close后的对象纯粹是浪费内存,应立即执行“set conn=nothing”释放内存
VB虽然会自动释放,但那是在离开变量作用域时,一般不够及时全局的连接对象conn可是在整个进程执行时间都存在的,只有进程结束时才离开它的作用域