vb.net中应用OO4O

Oracle objects for OLE(OO4O)是一组软件层,其设计目的是使与微软 COM 自动化和 ActiveX 兼容的语言直接访问 Oracle 数据库,这些语言包括 Visual Basic、Visual Basic for Application (VBA)、IIS Active Server Pages(ASP)、Windows 脚本宿主和 Visual C++。这些层是直接在 Oracle Call Interface(OCI)上编写的,绕过了标准的 ODBC、OLE DB 和ADO 层。虽然使用它创建的应用程序在使用其它数据库的时候会不兼容,但是它却能够直接地地访问 Oracle 数据库,而且能够更广地访问 Oracle 数据库。

开发人员可以使用 OO4O In-Process 自动化服务器来连接 Oracle 数据库服务器,还可以通过 COM 自动化对象执行 SQL 或 PL/SQL 过程。另外还有一种使用In-Process 服务器的方法,那就是从其接口“OracleInProcServer.XOraSession”为一个会话创建一个 COM 对象并访问子对象,如下面Visual Basic 的例子所示:

Set objSession = CreateObject("OracleInProcServer.XOraSession")

Set objDatabase = objSession.OpenDatabase("","scott/tiger",0)

使用一个数据库对象可以从数据库查询记录,或者直接执行 DLL 或 DML 语句。例如,下面是一段 VBA 脚本,它可以在 Microsoft Excel 中运行并取出 EMP 表中所有的数据然后添加到工作表的表格中:

Sub GetEmployees()

' Use OO4O

Set objSession = CreateObject("OracleInProcServer.XOraSession")

Set objDatabase = objSession.OpenDatabase("", "scott/tiger", 0)

Sql = "select * from emp"

Set oraDynaSet = objDatabase.DBCreateDynaset(Sql, 0)

If oraDynaSet.RecordCount > 0 Then

oraDynaSet.MoveFirst

For x = 0 To oraDynaSet.Fields.Count - 1

Cells(1, x + 1) = oraDynaSet.Fields(x).Name

Cells(1, x + 1).Format = Bold

Next

For y = 0 To oraDynaSet.RecordCount - 1

For x = 0 To oraDynaSet.Fields.Count - 1

Cells(y + 2, x + 1) = oraDynaSet.Fields(x).Value

Next

oraDynaSet.MoveNext

Next

End If

Set objSession = Nothing

Set objDatabase = Nothing

End Sub

虽然可能通过 Data/External 数据源函数从一个外部数据源将数据填充到一个 Excel 电子表,但是这个宏提供了更加直接的控制,允许你准确地指定数据怎样读到电子表中;而且由于宏在访问 Oracle 数据库的时候不经过额外的层,所以其速度也比较快。它还提供附加的功能,包括存储和提取大二进制对象数据(比如说图像)的能力。

OO4O套件包括一个ActiveX 控件Oracle Data Control,它可以绑定到自定义控件,比如说那些在 Visual Basic 中使用的根据用户接口迭代的自动跟踪数据的控件。

OO4O 还包括一个 OLE C++ 类库,该类库为 Visual C++ 开发人员提供一个类似的访问机制,可以被绑定到基础类上。

先看一段程序:

Public Function excToArr(ByVal sql As String, ByVal ar As ArrayList) As ArrayList

Dim OracleDBSession As OracleInProcServer.OraSession

Dim OraDatabase As OracleInProcServer.OraDatabase

Dim dataDynaset As OracleInProcServer.OraDynaset

Dim iColCount As Integer

Dim strSERVER As String = "****" '連接的數據庫服務名

Dim strUSERNAME As String = "****" '用戶名

Dim strPASSWORD As String = "****" '密碼

Dim ar1 As ArrayList

OracleDBSession = CType(CreateObject("OracleInProcServer.XOraSession"), OracleInProcServer.OraSession)

OraDatabase = CType(OracleDBSession.OpenDatabase(strSERVER, strUSERNAME & "/" & strPASSWORD, 0), OracleInProcServer.OraDatabase)

dataDynaset = CType(OraDatabase.CreateDynaset(sql, &H0&), OracleInProcServer.OraDynaset)

iColCount = CType(dataDynaset.Fields, OracleInProcServer.OraFields).Count - 1

Dim oraField As OracleInProcServer.OraField

Dim oraFields As OracleInProcServer.OraFields

Do While Not dataDynaset.EOF

ar1 = New ArrayList

For iColNumber As Integer = 0 To iColCount

oraFields = CType(dataDynaset.Fields, OracleInProcServer.OraFields)

oraField = CType(oraFields(iColNumber), OracleInProcServer.OraField)

ar1.Add(oraField.Value)

Next

dataDynaset.MoveNext()

ar.Add(ar1)

Loop

Return ar

End Function

OraSession对象 通常被使用在应用程序中,管理OraDatabase、Oraconnection、 OraDynaset对象。 Set OraSession=createobject("OracleInProcServer.XOraSession")

OraDatabase对象 OraDatabase对象表示对数据库服务器一个虚拟的登入。 Set OraDatabase=OraSession.DbopenDatabase("数据库别名","用户名/密码",0)

OraDynaset对象 OraDynaset对象允许用户浏览或更新由 SQL SELECT所返回的数据。OraDynaset 必须属于唯一的OraDatabase对象,因此如果建立一个OraDynaset对象可以使用Oradatabase 的DbCreateDynaset或CreateDynaset,两种结果一样。

OraField对象 OraField对象是表示在OraDynaset对象中的某一行(row)中的一个字段(column)或者数据项目(data item), 另一个角度,OraField对象间接从OraDynaset对象的OraFields的数据集合取得其中一个字段的数据,其数据类型通常为万 能变量(Variant) 设置 OraFields.value=值 付值 变量名称=Orafields.value 其Fields集合表示如下: Orafields("名称").value Orafields(i).value