ODBC不好
用OO4O
ORACLE自带的
连接的代码帮助中有

解决方案 »

  1.   

    几种用VB访问Oracle数据库技术的比较
    用Visual Basic访问Oracle数据库有许多方法可以实现,而每种方法都有其优缺点。你可以选择最适合你工作环境的方法,首先你必须了解这些方法是什么。在这篇文章里介绍一些访问Oracle数据库的常见方法,对每种方法进行简单的概述,并就每种方法的技术和特点进行比较,希望能给广大读者提供一些借鉴。一、数据访问对象(DAO)
    数据访问对象在很长一段时间内是Visual Basic访问数据库功能的主要技术。DAO已经存在了许多年并经历了多次修改,但它依然是许多数据库的对象模型。尽管DAO是数据访问中最弱的一种,但它同时也是最为人所熟知的。尽管DAO模型存在局限,但它依然有许多大量的函数可供Oracle用户使用,某些方面性能还可以令人接受的。
     
    DAO是一项过时的技术,尽管它仍应用于许多程序,但与新技术相比,它存在一些明显的缺点:
    ·DAO拥有的对象模型功能比较弱,在所有的数据库访问技术中它的功能最弱。
    ·DAO被设计为适用于JET而没有调整为适用于ODBC数据源。
    ·DAO不适合处理大量不同类型的数据源。
    二、远程数据对象(RDO)
    RDO是一种围绕着API产生的“包装” 性软件,它封装了API中的许多功能部件,为开发者提供了ODBC驱动器的所有功能。
     
    RDO是通过ODBC数据源访问数据的标志性技术,它围绕着ODBC API进行设计,并不完全适合与Oracle。尽管相对于DAO来说,它有很大的进步,但它的一些功能部件不适用于Oracle用户,因为Oracle的体系结构与SQL服务器体系存在相当大的差异。RDO的缺点:
    ·微软认为它过时了,不会再给它投入更多的工作。
    ·不能通过存储过程检索PL/SQ游标变量。
    ·RDO依赖于ODBC驱动器,通常会受到它们之间不相容性之间的影响。
    三、ActiveX数据对象(ADO)
    ADO不但可以进行异步查询、连接和开放式处理,而且还能基于文件和独立的Recordset、分层结构Recordset等。它提供一种稳定的接口来使用户利用多种不同的数据源包括从文本文件到ODBC关系型数据库到复杂的数据库组。
     
    ADO是当前微软的顶尖技术。随着版本的更新,在事件模型部分更加成熟,但从Oracle用户的角度出发,这个技术仍存在一些缺点:
    ·不能通过存储过程检索PL/SQ游标变量。
    ·不能使用Oracle邦定参数。
    ·数据环境还会带来一些问题,它相对来讲,还不够成熟。
    ·数据环境不支持Oracle打包过程。
    ·处理Oracle中的大对象比较困难
    四、Oracle的OLE对象(OO4O)
    Oracle的OLE对象(OO4O)是一种进程中的OLE服务器,它提供了一种对象层次结构,与DAO非常相似,但却不采用ODBC标准。它利用Oracle的调用接口来与Oracle会话。其中Oracle的调用接口是一种本地代码驱动器。令人遗憾的是它不能访问其他数据库。
     
    OO4O拥有优异的功能性,访问Oracle数据库,其他任何数据库访问方式很难达到它的功能性。但OO4O仍有不足:
    ·在某些实例中,它的速度不是最快的。部分原因是因为它是一种进程中的服务程序。
    ·OO4O不支持异步操作或事件。
    ·OO4O不支持GetRows方式。OO4O主要被设计用于可更新动态集。
    在OO4O中,连接是比较容易实现的,你只需简单的键入你的用户名、口令和数据库别名即可。对象模型与DAO的相似,比较明显的不同是所有的对象前面都冠有“Ora”字样。下面这些代码创建了Ora会话对象和相应的Ora数据库对象,然后又创建了Ora动态集来保存所检索的结果集。最后,关闭了Ora动态集和Ora数据库对象。
    程序清单
    private sub FetchOO4O()
    Dim OraSession As Object
    Dim OraDatabase As Object
    Set OraSession(i) = CreateObject("OracleInProcServer.XOraSession")
    Set OraDatabase(i) = OraSession(i).DbOpenDatabase("exampledb", "scott/tiger", 0&)'Connect to the daabase
    Set OraSession = CreatObject("OracleInProcSever.XoraSession")
    Set OaDataBase = OraSession.OpenDatebase("beq-local",_
    "video_user/ummagumma",ORADB_DEFAULT)'Run then query
    strSQL="SELECT * FROM video_store.movies ORDER BY movie_id" 
    Set rsMovies = OraDateBase.CreatDynaset(strSQL,ORADYN_READONLY)'Display the fields
    while not rsMovies.EOF
    FOR ifields = 0 to rsMovies.fields.Count-1
    Debug. rsMovies.(iFields)
    Next 'iField
    rsMovies.MoveNext
    WendSet rsMovies = Nothing
    Set OraSession= Nothing End Sub
    五、各种方法的比较
    上面已经列举了4种访问Oracle数据库的方法,下面进行一下总结。
     
      

  2.   

    'Microsoft OLE DB Provider for Oracle
    sConnect = "Provider=MSDAORA.1;" & _
                   "Data Source=" & sServer & ";User Id=" & sUser & ";Password=" & sPassword & ";"'Oracle Provider for OLE DB
    sConnect = "Provider=OraOLEDB.Oracle.1;" & _
                   "Data Source=" & sServer & ";User Id=" & sUser & ";Password=" & sPassword & ";"sConnect = "Provider=MSDAORA.1;" & _
                   "Data Source=" & sServer & ";User Id=" & sUser & ";Password=" & sPassword & ";"adoConnect.ConnectionString = sConnect
    adoConnect.Open
      

  3.   

    忘了注明了,我用的是 ado 了,:)Public adoConnect As New ADODB.Connection
      

  4.   

    供你参考:
    Private Sub Form_Load()
     测试窗体.Caption = "数据库列表(" + Form1.Text1.Text + ")"
      Dim db As Connection
      Set db = New Connection
      db.CursorLocation = adUseClient
     If Form1.Combo1.Text = "oracle" Then
       db.Open "Provider=MSDAORA.1;Password=manager;User  ID=system;Data Source=" + Form1.Text2.Text + ";Persist Security Info=True"
    End If
    End Sub
    'Form1.Text2.Text 中写入SQL语句(如select * from dbf_abc where ...)
      

  5.   

    sorry,gwb111昨天的帖子有误,改正如下,供你参考:
     Dim db As Connection
         Set db = New Connection
        db.CursorLocation = adUseClient
          If Form1.Combo1.Text = "oracle" Then
       db.Open "Provider=MSDAORA.1;Password=manager;User ID=system;Data Source=" + Form1.Text2.Text + ";Persist Security Info=True"
       Set adoPrimaryRS = New Recordset
           End If
     
          adoPrimaryRS.Open Form1.Text1.Text, db, adOpenStatic, adLockOptimistic
          Set grdDataGrid.DataSource = adoPrimaryRS
          mbDataChanged = False'Form1.Text1.Text 中写入SQL语句(如select * from dbf_abc where ...)
    'Form1.Text2.Text oracle客户端的服务名