ASP內置的ADO組件是微軟公司開發的互聯網絡數據庫存取解決方案,ADO通過ODBC訪問數據庫。
從理論上講ADO能訪問各種ODBC所支持的數據庫,然而對於Oracle就有些困難了,筆者在實踐中利用ADO訪問Oracle8,結果發現ADO不能訪問Oracle8的數字型字段,並且發現ADO訪問Oracle8的速度極慢。為了解決利用ASP訪問Oracle8的速度及其他技術問題,筆者嘗試了利用Oracle Object for OLE訪問Oracle8,結果完全取得了筆者預期的結果。
Oracle Object for OLE是Oracle公司為了客戶端存取數據庫所發展的一個重要的產品,它以Windows95/98/NT為基礎,共所有與OLE兼容的應用程序訪問Oracle數據庫。它是沒有用戶界面的OLE Server,其所包含的Oracle Objects Server是ASP訪問Oracle數據庫的重要功臣之一。
要通過Oracle Objects Server來訪問Oracle8數據庫,除了基本的Web服務器與ASP等軟件外,還必須確定Web服務器已經安裝了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服務器已安裝上述軟件後,還必須利用SQL*Net ClIEnt2.X或Oracle Net8 ClIEnt8.X進行數據庫的連接測試並設置數據庫別名(Database Alias)。 Oracle Objects Server共提供Oraclient、Orasession、Oraconnection、OraDatabase、OraDynaset、OraSQLstmt、OraFIEld、Oraparameter、Oraparameter Array等九個對象供開發者使用。
下面舉一具體例子說明如何在ASP中利用Oracle Object for OLE訪問Oracle 8。
筆者編寫了一個在ASP中利用Oracle Object for OLE2.3查詢Oracle 8.0.5數據庫,並進行分頁顯示的程序。由於Orasession對象的屬性中沒有控制分頁的屬性,應此筆者自編了分頁控制的程序。
以下共兩個ASP文件(query.asp和query1.asp),query.ASP文件先取得數據庫表的內容,然後計算分頁的頁數,如果頁數超過一頁,則交由query1.ASP處理,其程序代碼如下:
"query.ASP
<%
‘連接數據庫
set orasession=createobject("Oracleinprocserver.xorasession")
set oradatabase=orasession.dbopendatabase("orant","scotter/tiger",0)
‘設置查詢條件
sql="select * from cq_hjwj "
set session(oradynaset)=oradatabase.dbcreatedynaset(sql,0)
‘設置頁長
pagesize=15
if session(oradynaset).recordcount=0 then
response.write "無符合條件的數據"
else
response.write"<h3>查詢結果</h3>"
‘計算頁數
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&"頁,目前第"&page&"頁"
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">第一頁</a> "
response.write "<a href="query1.ASP?page=" & page-1 & "">上一頁</a> "
end if
if cint(page)<pages then
response.write "<a href="query1.ASP?page=" & page+1 & "">下一頁</a> "
response.write "<a href="query1.ASP?page=" & pages & "">最後頁</a> "
end if
set orasession=nothing
%>
<Html>
</Html>
"query1.ASP
<%
‘設置頁長
pagesize=15
if session(oradynaset).recordcount=0 then
response.write "無符合條件的數據"
else
response.write"<h3>查詢結果</h3>"
‘計算頁數
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&"頁,目前第"&page&"頁"
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">第一頁</a> "
response.write "<a href="query1.ASP?page=" & page-1 & "">上一頁</a> "
end if
if cint(page)<pages then
response.write "<a href="query1.ASP?page=" & page+1 & "">下一頁</a> "
response.write "<a href="query1.ASP?page=" & pages & "">最後頁</a> "
end if
set orasession=nothing
%>
<Html>
</Html>
上述程序在Windows Nt4.0+Iss4.0上通過運行,此方法能提高在Web上訪問Oracle的效率。