在我開發BS結構程式中,由於經常需要在ORACLE中處理一些容量較大的文字數據,所以經過反覆測試終於用ASP成功解決了大文本數據在ORACLE下存取問題。
一、運行環境:
1、Microsoft windows 2000 Server + IIS 5.0
2、Oracle8i中文標準版
二、建立資料表:
CREATE TABLE SYSTEM.TEST(
BLOB LONG,
ID NUMBER)
/
三、源程式:
1.資料存入程序:test.asp
<%
'表單提交處理部分
'------------------------------------------------- -
If request(ok)=1 then
'字符轉換函數
function tansstr(sstr)
sstr=replace(sstr, , )
sstr=replace(sstr,chr(13) & chr(10),<br>)
tansstr=sstr
end function
'提交資料賦值
a=lenb(request(text))
b=len(request(text))
c=tansstr(request(text))
'開啟資料庫,開啟test資料表以Rs為記錄集
Set OraSession=CreateObject(OracleInProcServer.XOraSession)
Set OraDatabase=OraSession.DbOpenDatabase(autop,system/manager,0)
Set rs=OraDatabase.CreateDynaset(select * from test order by id desc,0)
'求ID值
if rs.eof then
id=1
else
id=rs(id)+1
end if
'因為受SQL語句長度大小限制所以,以非SQL語句存入數據
'------------------------------------------------- -------
'新紀錄
rs.DbAddNew
'經典就在本句:以RS記錄集的Fields物件的DbAppendChunk方法處理大字段存入問題。
rs.Fields(blob).DbAppendChunk(c)
'存入ID值
rs(id)=id
'刷新記錄集
rs.DbUpdate
'顯示結果部分
'------------------------------------------------- --------
Response.write 資料已經存入資料庫。 <br>
Response.write 總計佔用字元數: & formatnumber(b,2,-2,-2,-1) & 字<br>
Response.write 總計佔用位元組數: & formatnumber(a,2,-2,-2,-1) & Byte<br>
Response.write <a href='view.asp'>請調閱……
'關閉資料連線。
rs.close
set rs=nothing
Set OraSession=nothing
Response.end
End If
%>
<html>
<body>
<form method=POST action=test.asp>
<p>Oracle大字段在ASP中存取問題的解決:</p>
<p><textarea rows=13 name=text cols=104></textarea></p>
<p><input type=submit value=存入name=B1></p>
<input type=hidden name=ok value=1>
</form>
</body>
</html>
2.資料調出程式:view.asp
<%
'連接資料庫,以唯讀方式開啟資料表
Set OraSession=CreateObject(OracleInProcServer.XOraSession)
Set OraDatabase=OraSession.DbOpenDatabase(autop,system/manager,0)
Set Rs=OraDatabase.DbCreateDynaset(select * from test order by id desc,4)
'賦初值:定義每次截取位元組大小為1024byte,最大可以設為65280byte (64K)
Size=65280
I=0
Do
'以Rs記錄集的Fields物件的DbGetChunk方法在迴圈中讀出數據
Text=Rs.Fields(Blob).DbGetChunk(I*Size,Size)
Response.write Text
'求出每次取出資料的詳細位元組數
Text_Size=Lenb(Text)
I=I+1
'如果每次取出資料的詳細位元組數小於欲定義的截取位元組大小則表示該條資料已經完畢,退出循環。
Loop until Text_Size<Size
'關閉數據連接
Set OraSession=nothing
%>
四、後記:
因為資料類型採用的是long型,ORACLE規定long型容量<2GB,所用以上方法可以存入<2GB的大文本,但是我發現在讀出的時候卻只能讀出最大64K的內容,也許是受ASP的限制。
各位,如果您有更多的體會或更好的解決方法請來信告之。