定义记录集的技术问题?困惑一段时间了.
有以下两种方式,
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.   

    两位老师答复我没看明白.不好意思?
    也可能我没说明白,我主要是想问,如果一个记录集打开了,我如果想再次执行open,我就必须关闭后才行再次打开,可是我不想这么做,因为太麻烦,我想每次open之前,都进行set r=new adodb.recordset这种办法,就避免了关闭记录集然后再次打开记录集(open)的代码,只不过不知道这种做法好不好,我试过,不报错.我担心的是会不会这样将打开多个记录集而不会释放,一直占着内存呀?即每次set rs=new adodb.recordset都会生成一个新的记录集.
    谢谢
      

  2.   

    set r=new adodb.recordset
      要是你每次不set r = nothing的话
      你使用了100次就实例化了100个r
      你的内存里面回占资源的
      

  3.   

    set r=new adodb.recordset
      要是你每次不set r = nothing的话
      你使用了100次就实例化了100个r
      你的内存里面回占资源的
    ----------------
    谢谢回复,比如实例了100个,可是只有最后一个可以被引用,是这个意思吗?也就是说那99个是无法引用了,只会占内存吗?如果不是这样,那99个能过什么方法来引用呢?
    我实例的这100个都是对应同一个记录集名字r呀?我以前的理解是新的实例覆盖旧实例.难道我的理解真的错误吗?
    如果这样,那么set r=new adodb.recordset就只能用一句了,是不是呀?
      

  4.   

    我想用close 再OPen 没什么不方便,不知道你为什么用set 重新实例干什么
      

  5.   

    呵呵~~这个想法有意思~~为什么close后open会不方便呢~~~即使重新实例也得open啊~~
      

  6.   

    和楼上一样,不清楚什么该OPEN,CLOSE   conn,rs, 我是试出来的
      

  7.   

    我觉得
    1.dim rs as adodb.recordset
    2.dim rs as new adodb.recordset
    都可以,只是第一种先定义结果集对象,而没有实例化,当然也没有分配内存空间,等要用到结果集时再实例化,再分配内存空间,用完就close 或 set mrc=nothing  都可以。
     
      第二种在定义的时候实例化,同时也分配内存。
      
      本人强烈建议每一种方法。等用时再实例化。  个人想法,仅供参考!:)
      

  8.   

    举个例子,问2个实际问题:
    1.比如在个按钮的单击事件,如果实例化了一个对象,是不是必须用代码set rs=nothing才能真正释放这个对象呀?还是执行完单击事件这个对象就自动释放内存了,前提我定义的是 dim rs as adodb.recordset
    2.我只做set rs=nothing,而不做rs.close,或是只做rs.close而不做set rs=nothing,是不是都不会真正释放对象呀?必须两句都写,缺一不可吗?并不是想偷懒,而是想明白一个道理.
    再次表示感谢.
      

  9.   

    //是不是必须用代码set rs=nothing才能真正释放这个对象呀?还是执行完单击事件这个对象就自动释放内存了每当用New创建一个对象时,对象的引用计数为0
    每用Object变量绑定一个对象的时候,对象的引用计数会加1
    每将一个Object变量设为Nothing时,原Object指向的对象的引用计数会减1
    当对象的引用计数减到0时,对象会释放这是COM对象的引用计数机制,VB中的对象实质上是COM对象
    所以想把VB对象机制弄清楚的话,得学COM当离开变量作用域时,VB会将Object变量自动设为Nothing
    但是有时会出现这样问题:若不在合适的时候取消对象引用(将Object变量设Nothing),对象不能正常释放
    所以最好养成自己将Object变量设Nothing的好习惯
      

  10.   

    其实两都间没什么大区别
    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类的实例所以,两者之间并没有什么大的区别
      

  11.   

    //我只做set rs=nothing,而不做rs.close,或是只做rs.close而不做set rs=nothing,是不是都不会真正释放对象呀close方法是真正意义上的关闭数据库联接“set rs=nothing”只是减少引用计数,当引用计数减到0时对象才会释放
    当对象释放的时候会调用对象的析构方法释放资源,比如recordset会调用自身的close方法VB的ADO对象实际上是扮演一个中介商的角色
    当有客户通过中介商访问商品时(有引用计数),中介商会向厂家调货
    当没有用户需要中介商时(引用计数减到0),中介商会倒闭(对象释放),向厂家解除合约(.close)
    当用户发现再也不需要利用中介商时,可以强迫其向厂家解除合约(.close),再强行关闭(set rs=nothing)
      

  12.   

    比如我创建一个全局的连接对象conn,我可以在每个窗体中都使用这个连接,是不是可以这样做,用到连接时,新增一个引用,即多出来一个对象变量,如conn1=conn,然后在这个窗体中就使用conn1,用完之后释放引用,set conn1=nothing,这样做后conn连接对象仍然存在,可是当我只接用conn.close后,conn这个对象就真的不存在了.是这样吗?
    还有:conn.close之后还必须set conn=nothing吗?如果必须加上set conn=nothing,又是因为什么呢?因为conn.close是强行关闭连接对象呀?
    谢谢老师们.
      

  13.   

    //conn.close之后还必须set conn=nothing吗中介商已经与厂家解除合约了,它还有必要存在吗
    在离开变量作用域时,VB会自动释放这样的对象
    只不过为了养成良好的习惯,建议手动释放(set conn=nothing)
      

  14.   

    对象引用是指:Set Obj2 = Obj1当调用.close后,对象虽然还存在(而且还是可以创建引用),但是它再也没有作用了
    直到你再次调用.open,对象才有意义也就是说,.close后的对象纯粹是浪费内存,应立即执行“set conn=nothing”释放内存
    VB虽然会自动释放,但那是在离开变量作用域时,一般不够及时全局的连接对象conn可是在整个进程执行时间都存在的,只有进程结束时才离开它的作用域