Dim conn as adodb.connection
Dim rst as adodb.recordset
'其他操作  
......
'开始数据库操作
set conn=createobject("adodb.connection")
set rst=createobject("adodb.recordset")

解决方案 »

  1.   

    Dim conn as  adodb.connection
    Dim rst as  adodb.recordset
    set conn=new adodb.connection
    set rst=new adodb.recordset
      

  2.   

    什么叫不正规?难道一定要这样写?我觉得只要逻辑上没问题就可以了。
    dim rs_addcondition as adodb.recordset
    set rs_addcondition = new adodb.recordset
    rs_addcondition.ActiveConnection = conn
    rs_addcondition.Source = "SELECT * FROM aaa"
    rs_addcondition.CursorType = 0
    rs_addcondition.CursorLocation = 2
    rs_addcondition.LockType = 3
    rs_addcondition.Open()
    rs_addcondition_numRows = 0
      

  3.   

    本人习惯于用以下方式  Dim conn as  adodb.connection
     Dim rst as  adodb.recordset
     Dim SqlStr as String
     set conn = new Adodb.Connection
      conn.open"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库名称;Data Source=服务器名称
      
      SqlStr = "select * from 表" 
      Set Rst=New Adodb.RecordSet
      rst.open SqlStr, conn, adOpenKeyset, adLockOptimistic
      
      

  4.   

    同意wjy88(至尊宝)写的
    Dim conn as  adodb.connection
    Dim rst as  adodb.recordset
    set conn=new adodb.connection
    set rst=new adodb.recordset  不要写成Dim conn as new adodb.connection,关键字new不要在声明时写。
    原因想不起来了,好象差别很大。
    有一本白色封皮的《Visual Basic 6编程技术大全》(作者Francesco Balena)上有相关解释,这是一本好书,推荐大家收藏。(我可不是推销员哦)
      

  5.   

    Dim Cn1 As New ADODB.Connection
    Dim Rs1 As New ADODB.Recordset
    Dim strSQL as String
    Cn1.Open "ODBC_NAME"
    strSQL="...."
    Rs1.Open strSQL,Cn1,adOpenKeyset, adLockOptimistic
    ..
    Rs1.Close
    Set Rs1=Nothing
    Cn1.Close
    Set Cn1=Nothing
      

  6.   

    同意wjy88(至尊宝)的看法
    Dim conn as  adodb.connection
    Dim rst as  adodb.recordset
    set conn=new adodb.connection
    set rst=new adodb.recordset  New关键字不要用在声明中,应该先声明,再用set aa=new obj的形式,不要Dim conn as new adodb.connection。好象差别很大。
    原因记不起来了。好象在《Visual Basic 6编程技术大全》(作者Francesco Balena)中有详细说明。这是本好书,讲得很深,值得收藏。(不要拍板砖,我可不是推销员)。奇怪,刚才明明发出回复了,为什么显示不出来?害得我又写了一次。
      

  7.   

    感谢各位!但是我是想把这个连接方式放在全局模块中,如果在程序模块中去调用CONN和RST,如何做申明呢?public 肯定不行,会出现"二重性",但是我用我的方法就可以先讲conn和rst用public申明!大家看看这该怎么解决!
      

  8.   

    对了,哪一本洋书上说,VB中不能用
    set conn=createobject("adodb.connection"),
    只能用set conn=new adodb.connection。
    set conn=createobject("adodb.connection")的写法只能用在asp上我坚信洋人书上写的,因为我们在学洋人的东西。
      

  9.   

    你在全局模块中用public声明应该可以的呀?怎么不行呢?
      

  10.   

    ADO控件是很直观,但代码的可读性下降了。不要说别人,你自己半年以后研究代码可能也很费力。
    可能的话不用控件,都用代码(建立对象实例),缺省值以外的属性都用代码写
      

  11.   

    DIm cnn as new adodb.connect
    是在声明时就创建了对象的实例
    dim cnn as adodb.connect
    set cnn=new adodb.connect
    是在使用时创建实例。
    两者使用上是完全没有区别的,只是对内存的申请有所不同。不能说孰优孰劣,视具体情况而定。
      

  12.   

    To bgxy(bgxy):
    哪本洋书上胡说八道的。谁说VB中不能用CreateObject创建ADO对象的。只不过效率上比 Set New方式低一点而已。但又不是在大循环中(我想大概不会有人这么做的吧)创建,影响不大。相反,如果是在公用模块的公用函数中,我更喜欢使用CreateObject创建ADO对象,因为这样做工程可以不必事先引用ADO库,公用函数可以方便地进行移植。To firechun(天火):(探讨一下)
    DIM cnn as new ADODB.Connection 好象是在对cnn的第一次调用创建对象的。可以做个测试,用Dim New 方式定义一个引用Active Dll工程的对象变量,进行单步跟踪运行,会看到只有在对变量进行调用时对象初始化事件才发生。当然,我只是个猜测,这并不表明这时才进行内存分配,可能是你所说在声明时就已经分配了内存。
      

  13.   

    如果我现在在全局模块中申明CNN和rst是用什么申明好呢?(我在程序中肯定要调用cnn和rst的)怎么实现?
      

  14.   

    to random:
    使用dim cnn as new adodb.connection还是set cnn=new adodb.connection,我记得还是在99年时和公司的同事讨论过,当时讨论的意见是使用前者较好,具体的原因我忘了.:( (人老记性差,连connection都写成connect),你做的测试应该没问题(我没做),但确实不能说此时才进行内存分配,因为内存的分配应该不会涉及到对象的初始化。new操作符来自于C++,我记得在内存的分配上C++好象提到过。
    这一两年编码较少,对这些纯理论上的东西关注的也较少了,事实上99年那次的讨论也是源于当年的ms tech大会上对这个问题有过阐述,因此引发了同事之间的争议。
    另:写完上面的话,查了一下MSDN,rnadom说得不错,dim cnn as new adodb.connection是第一次调用时创建对象的,不过上面没说内存分配的情况.:(
      

  15.   

    dim aa as new object
    vb会在第一次调用该对象的时候初始化该对象,这种技术使得无需手工初始化一个对象。缺点是:有一个ClassA,其中Initlize方法中连接了某一个数据库,如果使用了As New方法来定义一个ClassA实例,使用ClassA.DoSomeWork的时候。如果数据库服务器不可用ClassA会返回一个奇怪的错误,如果没有ClassA的源码进行调试会让人很头疼的。
      

  16.   

    大家可以用vb的数据窗体生成器试一下 里面会生成很多种调用ado的方法 有的我是第一次发现 但是我感觉很严禁 正规
      

  17.   

    我也刚刚做了一个管理系统!
    你的问题我一个一个来回答吧!
    1。对于全局调用问题!
       可以在全局模块中申明如:
       Public Connection As ADODB.Connection   '定义一个数据源的联接
       Public recordset As ADODB.recordset    '定义一个记录集   这样只要在程序最开始打开connection 就能在全局使用了!!2。运用ado连接数据库有很多方法!!
       A.直接用adodc控件
         所有属性在控件中设置好!
         优点:方便,简洁。不用代码就能实现
         缺点:不够灵活,如在运行对adodc的Datasource更改后都要用refresh方法,这有可能产一个可捕捉的错误,我怎么都避免不了
       B.运用代码:
          a.用大家常用的recordset
           Dim conn as new adodb.connection
           Dim rst as new adodb.recordset
           conn.open"Provider=SQLOLEDB.1;Integrated Security=SSPI;Persist Security Info=False;Initial Catalog=数据库名称;Data Source=服务器名称
           set rst= new adodb.recordset
           rst.open "select * from 表", conn, adOpenKeyset, adLockOptimistic
           优点:对数据源的控制可以做到非常的细致!(包括:读写属性,游标状态,数据库路径。都可在程序运行是更改!!非常有用)
           缺点:除了要写的多点也没什么。还有就扫尾工作多点,如:记录集用完后要rst.close
    然后 set rst = nothing ,以释放内存       b.直接用connection的execure方法,不调用记录集recordset。如:
          '假设connection已经打开!
          strSQL = "select * from 企业产品表"
          Set 对象控件.DataSource = connection (strSQL)
          这时,connection.execute (strSQL)就相当于是一个recordset!
          如果你并不需要和对象控件的datasource相连,而只是想完成一个不需要显示记录的动作比如,添加一个记录、删除一个记录、更新一个记录就只要这样写
          strSQL = "select * from 企业产品表"
          connection.execute strSQL  
          就可以了!!
          优点:非常的方便,而且容易在运行时控制!
          缺点:用.execute方法打开的记录都是只读的属性!如果要实现数据的即时修改、更新,还必须用recordset!
        
        以上是我个人的一点经验和看法!
             
      

  18.   

    对于大家讨论的dim cnn as new object
    我觉得vb在初始话的时候已经对程序中声明的变量,对象进行了内存分配!
    只是用到new命令时创建了对象!所以把new命令放到声明语句中的好处就是一举2得!
    使代码简洁!new命令应该是从c中来的,而在c中new指令,仅仅是对所创建的对象赋给一个指针
    内存是用程序自己以占用的内存。而不是新的系统内存中划出来的。以下是msdn的原文:
    “The new operator is used to allocate objects and arrays of objects. The new operator allocates from a program memory area called the “free store.” ”
      

  19.   

    关于使用New关键字的区别可以试验下面的代码:
    Dim A AS Class1
    Dim B As New Class1Set A=New Class1                      'A Begin Init
    Debug.Print A.Caption
    Debug.Print B.Caption                 'B Begin Init
    Set A=Nothing
    Set B=Nothing
    Debug.Print B.Caption                 'B Init 
    Debug.Print A.Caption                 'Error 
    (假设Class1有Caption属性)关于Connection对象,我的意见是全局共享(MS也推荐),因为他消耗很多的资源,当然,如果你使用COM+,MS会又推荐你使用时"创建",用完后立即“释放”,我也统一这点,这里COM+本身并不真的释放了对象,而是缓冲了,这对于非常多的用户是非常有用的。
    Recordset我是极力不推荐全局共享的,很简单,他是用BookMark工作的,任何其他的代码都可能移动指针,而造成无法预测的错误。如果你真的要共享记录的数据可以将数据放到全局的数组中,(利用GetRows方法)以上是我的拙见,希望交流
      

  20.   

    是的,同意楼上的。recordset全局模式的话,老是是会出现莫名其妙的错误!不推荐使用