在ASP中利用Oracle Object for OLE訪問(wèn)Oracle 8
發(fā)布時(shí)間:2008-07-11 閱讀數(shù): 次 來(lái)源:網(wǎng)樂(lè)原科技
ASP(Active Server Pages)是微軟公司為開(kāi)發(fā)互聯(lián)網(wǎng)絡(luò)應(yīng)用程序所提出的工具之一,它是一種類似HTML(Hypertext
Markup Language超文本標(biāo)記語(yǔ)言)、Script與CGI(Common Gateway Interface通用網(wǎng)關(guān)接口)的結(jié)合體,但是其運(yùn)行效率卻
比CGI更高、程序編制也比HTML更方便且更有靈活性,程序安全性及保密性遠(yuǎn)比Script好。因此ASP是目前網(wǎng)頁(yè)開(kāi)發(fā)技術(shù)中
最容易學(xué)習(xí)、靈活性最大的開(kāi)發(fā)工具。
ASP內(nèi)置的ADO組件是微軟公司開(kāi)發(fā)的互聯(lián)網(wǎng)絡(luò)數(shù)據(jù)庫(kù)存取解決方案,也是ASP存取數(shù)據(jù)庫(kù)的重要功臣,ADO通過(guò)ODBC訪問(wèn)數(shù)
據(jù)庫(kù),從理論上講ADO能訪問(wèn)各種ODBC所支持的數(shù)據(jù)庫(kù),如Microsoft SQL Server,Access,F(xiàn)oxpro,Oracle,Dbase等,
然而在實(shí)踐中我們發(fā)現(xiàn)ADO可以完全支持Microsoft SQL Server和Acess,然而對(duì)于Oracle就有些困難了,筆者在實(shí)踐中利
用ADO訪問(wèn)Oracle8,結(jié)果發(fā)現(xiàn)ADO不能訪問(wèn)Oracle8的數(shù)字型字段,并且發(fā)現(xiàn)ADO訪問(wèn)Oracle8的速度極慢。
為了解決利用ASP訪問(wèn)Oracle8的速度及其他技術(shù)問(wèn)題,筆者嘗試了利用Oracle Object for OLE訪問(wèn)Oracle8,結(jié)果完全取
得了筆者預(yù)期的結(jié)果。
Oracle Object for OLE是Oracle公司為了客戶端存取數(shù)據(jù)庫(kù)所發(fā)展的一個(gè)重要的產(chǎn)品,它以Windows95/98/NT為基礎(chǔ),共
所有與OLE兼容的應(yīng)用程序訪問(wèn)Oracle數(shù)據(jù)庫(kù)。它是沒(méi)有用戶界面的OLE Server,其所包含的Oracle Objects Server是ASP
訪問(wèn)Oracle數(shù)據(jù)庫(kù)的重要功臣之一。
要通過(guò)Oracle Objects Server來(lái)訪問(wèn)Oracle8數(shù)據(jù)庫(kù),除了基本的Web服務(wù)器與ASP等軟件外,還必須確定Web服務(wù)器已經(jīng)安
裝了Oracle Object for OLE軟件,其所需的軟件包括:Network Protocol Adapter、Oracle Object for OLE2.X、
SQL*Net Client2.X或Oracle Net8 Client8.X、SQL*Plus及Oracle8 ODBC Driver。在確定Web服務(wù)器已安裝上述軟件后,
還必須利用SQL*Net Client2.X或Oracle Net8 Client8.X進(jìn)行數(shù)據(jù)庫(kù)的連接測(cè)試并設(shè)置數(shù)據(jù)庫(kù)別名(Database Alias)。
Oracle Objects Server共提供Oraclient、Orasession、Oraconnection、OraDatabase、OraDynaset、OraSQLstmt、
OraField、Oraparameter、Oraparameter Array等九個(gè)對(duì)象供開(kāi)發(fā)者使用。其功能與作用分述如下:
1.Oraclient對(duì)象
Oraclient對(duì)象是用來(lái)定義服務(wù)器端(Client或Workstation)的范圍,Oraclient會(huì)記錄此服務(wù)器端的所有Orasession對(duì)象。
Oraclient由系統(tǒng)根據(jù)需要自動(dòng)建立。
2.Orasession對(duì)象
Orasession對(duì)象用來(lái)在程序中管理Oraconnection、OraDatabase、OraDynaset等對(duì)象,其建立方法如下:
Set Orasession=Create(“OracleInProcServer.Xorasession”)
3.Oraconnection對(duì)象
Oraconnection對(duì)象表示對(duì)OraDatabase對(duì)象的連接,當(dāng)需要建立OraDatabase對(duì)象時(shí),系統(tǒng)會(huì)自動(dòng)產(chǎn)生一個(gè)Oraconnection
對(duì)象。反之,當(dāng)與數(shù)據(jù)庫(kù)斷開(kāi)連接時(shí),Oraconnection對(duì)象自動(dòng)釋放。
4.OraDatabase對(duì)象
OraDatabase對(duì)象表示對(duì)數(shù)據(jù)庫(kù)服務(wù)器的虛擬登錄,其登錄方法如下:
Set Oradadabase=Orasession.Dbopendatabase_
(“數(shù)據(jù)庫(kù)別名”, “用戶名稱/密碼”,0)
5.OraDynaset對(duì)象
OraDynaset對(duì)象會(huì)將數(shù)據(jù)庫(kù)服務(wù)器符合SELECT命令的數(shù)據(jù)加以存儲(chǔ)在客戶端的緩沖區(qū),讓用戶瀏覽或更新,最后將結(jié)果寫
回到服務(wù)器,其方法如下:
SetOraDynaset=OraDatabase.DbcreateDynaset(“SQL語(yǔ)句”,0)
6.OraSQLstmt對(duì)象
OraSQLstmt對(duì)象通常用來(lái)運(yùn)行SQL命令、或是調(diào)用存儲(chǔ)過(guò)程,其用法如下:
Set Orasqlstmt=Oradatabase.createSQl(“SQL語(yǔ)句”,0)
7.OraField對(duì)象
OraField對(duì)象表示在OraDynaset對(duì)象中的某個(gè)字段或數(shù)據(jù)項(xiàng)目,他通過(guò)Value屬性設(shè)置或取得OraDynaset對(duì)象中的某個(gè)字段
值。
8.Oraparameter對(duì)象
Oraparameter對(duì)象表示一個(gè)在SQL命令或PL/SQL程序區(qū)塊中所附加的變量。
9.Oraparameter Array對(duì)象
Oraparameter Array對(duì)象是Oraparameter對(duì)象的數(shù)組類型,Oraparameter Array對(duì)象可以間接通過(guò)OraDatabase對(duì)象的
Oraparameter數(shù)據(jù)集合來(lái)增加、存取或刪除某個(gè)變量。
下面舉一具體例子說(shuō)明如何在ASP中利用Oracle Object for OLE訪問(wèn)Oracle 8。
筆者編寫了一個(gè)在ASP中利用Oracle Object for OLE2.3查詢Oracle 8.0.5數(shù)據(jù)庫(kù),并進(jìn)行分頁(yè)顯示的程序。由于
Orasession對(duì)象的屬性中沒(méi)有控制分頁(yè)的屬性,應(yīng)此筆者自編了分頁(yè)控制的程序。
以下共兩個(gè)ASP文件(query.asp和query1.asp),query.asp文件先取得數(shù)據(jù)庫(kù)表的內(nèi)容,然后計(jì)算分頁(yè)的頁(yè)數(shù),如果頁(yè)數(shù)超
過(guò)一頁(yè),則交由query1.asp處理,其程序代碼如下
‘query.asp
<%
‘連接數(shù)據(jù)庫(kù)
set orasession=createobject("oracleinprocserver.xorasession")
set oradatabase=orasession.dbopendatabase("orant","scotter/tiger",0)
‘設(shè)置查詢條件
sql="select * from cq_hjwj "
set session(oradynaset)=oradatabase.dbcreatedynaset(sql,0)
‘設(shè)置頁(yè)長(zhǎng)
pagesize=15
if session(oradynaset).recordcount=0 then
response.write "無(wú)符合條件的數(shù)據(jù)"
else
response.write"<h3>查詢結(jié)果</h3>"
‘計(jì)算頁(yè)數(shù)
pages=int(session(oradynaset).recordcount/pagesize)
if pages*pagesize=session(oradynaset).recordcount then
pages=int(session(oradynaset).recordcount/pagesize)
else
pages=int(session(oradynaset).recordcount/pagesize)+1
end if
if request("page")="" then
page=1
else
page=cstr(request("page"))
end if
response.write"共"&pages&"頁(yè),目前第"&page&"頁(yè)"
response.write"<table border=5><tr>"
for i=0 to session(oradynaset).fields.count - 1
response.write"<td>"
response.write session(oradynaset).fields(i).name
response.write"</td>"
next
response.write "</tr>"
startrow=(page-1)*pagesize+1
endrow=page*pagesize
oradynaset.moveto startrow
for j=startrow to endrow
response.write"<tr>"
for i=0 to session(oradynaset).fields.count - 1
response.write"<td>"
response.write session(oradynaset).fields(i).value
response.write"</td>"
next
response.write"</tr>"
session(oradynaset).dbmovenext
if session(oradynaset).eof then exit for
next
response.write"</table>"
end if
if page>1 then
response.write "<a href='query1.asp?page=1'>第一頁(yè)</a> "
response.write "<a href='query1.asp?page=" & page-1 & "'>上一頁(yè)</a> "
end if
if cint(page)<pages then
response.write "<a href='query1.asp?page=" & page+1 & "'>下一頁(yè)</a> "
response.write "<a href='query1.asp?page=" & pages & "'>最后頁(yè)</a> "
end if
set orasession=nothing
%>
<html>
</html>
‘query1.asp
<%
‘設(shè)置頁(yè)長(zhǎng)
pagesize=15
if session(oradynaset).recordcount=0 then
response.write "無(wú)符合條件的數(shù)據(jù)"
else
response.write"<h3>查詢結(jié)果</h3>"
‘計(jì)算頁(yè)數(shù)
pages=int(session(oradynaset).recordcount/pagesize)
if pages*pagesize=session(oradynaset).recordcount then
pages=int(session(oradynaset).recordcount/pagesize)
else
pages=int(session(oradynaset).recordcount/pagesize)+1
end if
if request("page")="" then
page=1
else
page=cstr(request("page"))
end if
response.write"共"&pages&"頁(yè),目前第"&page&"頁(yè)"
response.write"<table border=5><tr>"
for i=0 to session(oradynaset).fields.count - 1
response.write"<td>"
response.write session(oradynaset).fields(i).name
response.write"</td>"
next
response.write "</tr>"
startrow=(page-1)*pagesize+1
endrow=page*pagesize
oradynaset.moveto startrow
for j=startrow to endrow
response.write"<tr>"
for i=0 to session(oradynaset).fields.count - 1
response.write"<td>"
response.write session(oradynaset).fields(i).value
response.write"</td>"
next
response.write"</tr>"
session(oradynaset).dbmovenext
if session(oradynaset).eof then exit for
next
response.write"</table>"
end if
if page>1 then
response.write "<a href='query1.asp?page=1'>第一頁(yè)</a> "
response.write "<a href='query1.asp?page=" & page-1 & "'>上一頁(yè)</a> "
end if
if cint(page)<pages then
response.write "<a href='query1.asp?page=" & page+1 & "'>下一頁(yè)</a> "
response.write "<a href='query1.asp?page=" & pages & "'>最后頁(yè)</a> "
end if
set orasession=nothing
%>
<html>
</html>
上述程序在Windows Nt4.0+Iss4.0上通過(guò)運(yùn)行。
由于ORACLE數(shù)據(jù)庫(kù)應(yīng)用很廣泛,市場(chǎng)銷售量一直占前幾位,許多企業(yè)的MIS、IT系統(tǒng)都以O(shè)RACLE數(shù)據(jù)庫(kù)作為數(shù)據(jù)存儲(chǔ)基礎(chǔ),
將ORACLE數(shù)據(jù)庫(kù)的信息加到網(wǎng)頁(yè)中,可以大大地豐富網(wǎng)頁(yè)發(fā)布的信息,使我們的網(wǎng)頁(yè)既能發(fā)布實(shí)時(shí)、復(fù)雜的數(shù)據(jù)庫(kù)信息,
又能接收客戶機(jī)對(duì)數(shù)據(jù)庫(kù)的修改信息。因此使用此方法能提高在Web上訪問(wèn)ORACLE的效率。