忘记是谁说的了,当没什么新东西可写的时候,就是该总结的时候了。自从一进公司,我就一直做着用vb通过OO4O读写数据库的工作。对OO4O也多少有些了解了,参考着前人的文章,我也总结一下,不然总让我的博客空着也不大好看。好了,咱们言归正传。
OO4O即Oracle Object for OLE,是一组软件层,通过调用Oracle的接口来与Oracle会话。
其设计目的是使与微软 COM 自动化和 ActiveX 兼容的语言直接访问 Oracle 数据库,这些语言包括 Visual Basic、Visual Basic for Application (VBA)、IIS Active Server Pages(ASP)、Windows 脚本宿主和 Visual C++(在这里我们只讲一下用vb如何实现)。这些层是直接在 Oracle Call Interface(OCI)上编写的,绕过了标准的 ODBC、OLE DB 和ADO 层。虽然使用它创建的应用程序在使用其它数据库的时候会不兼容,但是它却能够直接地访问 Oracle 数据库,而且能够更广地访问 Oracle 数据库这是其他任何数据库访问方式很难达到的。但它也有不足:
·在某些实例中,它的速度不是最快的。部分原因是因为它是一种进程中的服务程序。
·OO4O不支持异步操作或事件。
·OO4O不支持GetRows方式。OO4O主要被设计用于可更新动态集。
(参见《几种用VB访问Oracle数据库技术的比较》西安市雁塔路中段1号二室 郑浩 马晓锋 江振治)
使用这一技术,我们在 VB 中不用任何控件就可轻松访问 Oracle 数据库的内容,当然前提是你必须安装了Oracle 的 Oracle Object for OLE和Oracle 的客户端或 Personal Oracle,否则会得到“无法建立对象” 的错误信息。对于OO4O的简单操作,可以参考前人的文章。
http://www.dbonline.cn/source/oracle/20040216/OTHER_access%20Oracle%20database%20using%20OLE(1).html
http://www.dbonline.cn/source/oracle/20040216/OTHER_access%20Oracle%20database%20using%20OLE(2).html
这里为了大家看着方便,和文章的连贯性,我就直接搬来了。
我们要建立与 Oracle 数据库的联接,这里我们使用到两个对象 OraSession 对象和 OraDatabase 对象。 OraSession 对象用于管理 OraDatabase 对象,使用 OraSession 对象的 OpenDatabase 方法可以建立 OraDatabase 对象,同时建立与 Oracle 数据库的联接以访问数据库的内容。下面的例子演示了如何使用 OraSession 对象和 OraDatabase 对象建立与 Oracle 数据库的联接:
Private Sub Command_Click()
Dim OraSession As Object
Dim OraDatabase As Object
Dim Ls_username As String, Ls_password As String, Ls_server As String
Ls_server = "" ' 联接本地 Oracle 数据库
Ls_username = "system"
' 用户名为 system
Ls_password = "manager"
' 密码为 manager , 建立 OraSession 对象
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
' 错误处理
On Error GoTo Connect_Err:
' 建立 OraDatabase 对象以联接到 Oracle 数据库
Set OraDatabase = OraSession.DbOpenDatabase(Ls_server, Ls_username + "/" + Ls_password, 0&&)
MsgBox " 数据库联接成功! ", vbOKOnly + vbInformation, " 提示信息 "
On Error GoTo 0
Exit Sub
Connect_err:
If InStr(OraSession.LastServerErrText, "ORA-01017") Then
MsgBox " 无效的用户名和密码,数据库联接不成功! ", vbOKOnly + vbCritical, " 提示信息 "
Else
MsgBox " 数据库联接不成功!请查看下面的出错信息: "+Chr(13)+OraSession.LastServerErrText, vbOKOnly + vbCritical, " 提示信息 "
End If
End Sub
建立了数据库联接后我们就可以运行相应的 SQL 命令对数据库的内容进行相应的操作了。对于非查询 SQL 命令(非 SELECT 命令),可以使用 OraDatabase 对象的 ExecuteSQL 方法执行,而对数据库的查询则可使用 OraDatabase 对象的 CreateDynaset 方法建立 OraDynaset 对象来执行查询,然后建立 OraFields 对象对查询结果进行检索。下面我们分别举例演示如何新建一个用户然后查询并列出 DBA_USERS 视图中 USERNAME 字段的内容,程序如下:
Private Sub Command_Click()
Dim OraSession As Object
Dim OraDatabase As Object
Dim OraDynaset As Object
Dim OraFields As Object
Dim Ls_username As String, Ls_password As String, Ls_server As String
Dim Ls_mess As String
Dim Li_I As Integer
Ls_server = ""
' 联接本地 Oracle 数据库
Ls_username = "system"
' 用户名为 system
Ls_password = "manager"
' 密码为 manager
Set OraSession = CreateObject("OracleInProcServer.XOraSession")
On Error GoTo Connect_Err:
Set OraDatabase = OraSession.DbOpenDatabase(Ls_server, Ls_username + "/" + Ls_password, 0&&)
' 执行 SQL 命令出错后跳转到 Sql_err
On Error GoTo Sql_err:
Set OraDynaset = OraDatabase.DbCreateDynaset("SELECT USERNAME FROM DBA_USERS", 0&&)
If OraDynaset.RecordCount > 0 Then
' 建立 OraFields 对象对查询的内容进行检索
Set OraFields = OraDynaset.Fields
Ls_mess = “用户列表:” + Chr(13)
Ls_mess = Ls_mess + OraFields( “ USERNAME ” ).Value ‘此处也可以直接用OraFields(0).Value
for Li_I = 1 to OraDynaset.RecordCount - 1
OraDynaset. MoveNext
Ls_mess = Ls_mess + Chr(13) + OraFields( “ USERNAME ” ).Value
Next Li_I
MsgBox Ls_mess , vbOKOnly + vbInformation, " 查询结果 "
Else
MsgBox " 未查询到相应信息! ", vbOKOnly + vbInformation, " 提示信息 "
End If
' 创建新用户 TEST ,密码为 TEST
OraDatabase.ExecuteSQL ("CREATE USER TEST IDENTIFIED BY TEST")
MsgBox " 用户创建成功! ", vbOKOnly + vbInformation, " 提示信息 "
Set OraDynaset = OraDatabase.DbCreateDynaset("SELECT USERNAME FROM DBA_USERS", 0&&)
If OraDynaset.RecordCount > 0 Then
' 建立 OraFields 对象对查询的内容进行检索
Set OraFields = OraDynaset.Fields
Ls_mess = “用户列表:” + Chr(13)
Ls_mess = Ls_mess + OraFields( “ USERNAME ” ).Value
for Li_I = 1 to OraDynaset.RecordCount - 1
OraDynaset. MoveNext
Ls_mess = Ls_mess + Chr(13) + OraFields( “ USERNAME ” ).Value
Next Li_I
MsgBox Ls_mess , vbOKOnly + vbInformation, " 用户建立后查询结果 "
Else
MsgBox " 未查询到相应信息! ", vbOKOnly + vbInformation, " 提示信息 "
End If
Exit Sub
Connect_err:
If InStr(OraSession.LastServerErrText, "ORA-01017") Then
MsgBox " 无效的用户名和密码,数据库联接不成功! ", vbOKOnly + vbCritical, " 提示信息 "
Else
MsgBox " 数据库联接不成功!请查看下面的出错信息: " +Chr(13) + OraSession.LastServerErrText, vbOKOnly + vbCritical, " 提示信息 "
End If
Exit Sub
Sql_err:
If OraDatabase.LastServerErr <> 0 Then
MsgBox " 数据库操作出错!请查看下面的出错信息: " + Chr(13) + OraDatabase.LastServerErrText, vbOKOnly + vbCritical, " 提示信息 "
End If
End Sub
因为上面的对数据库的写操作没有提交,因此程序结束后,数据库内容没有改变,若要改变需要在写操作之前加上OraSession.BeginTrans,写操作之后加上OraSession.CommitTrans或OraSession.Rollback。
经过上面两个例子,相信大家对OO4O都有了一定的了解,下面我再来说一下对于调用用户自定义数据库函数的实现。