BS構造プログラムを開発する際、ORACLE上で大容量のテキストデータを処理する必要が生じることが多く、テストを繰り返した結果、最終的にASPを使用することでORACLE上での大容量テキストデータアクセスの問題を解決することができました。
1. 動作環境:
1. Microsoft Windows 2000 Server + IIS 5.0
2. Oracle8i 中国語標準版
2. データテーブルを作成します。
テーブルの作成 SYSTEM.TEST(
ブロブロング、
識別番号)
/
3. ソースプログラム:
1. データ ストレージ プログラム: test.asp
<%
'フォーム送信処理部
'------------------------------------------------ -
request(ok)=1 の場合、
'文字変換機能
関数tansstr(sstr)
sstr=replace(sstr, , )
sstr=replace(sstr,chr(13) & chr(10),<br>)
Tansstr=sstr
終了関数
'データ割り当てを送信します
a=lenb(リクエスト(テキスト))
b=len(リクエスト(テキスト))
c=tansstr(リクエスト(テキスト))
'データベースを開き、Rs をレコードセットとしてテストデータテーブルを開きます
OraSession=CreateObject(OracleInProcServer.XOraSession) を設定します。
OraDatabase=OraSession.DbOpenDatabase(autop,system/manager,0) を設定します。
Set rs=OraDatabase.CreateDynaset(select * from test order by id desc,0)
'ID値を見つけます
もし rs.eof なら
ID=1
それ以外
id=rs(id)+1
終了する場合
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) & バイト<br>
Response.write <a href='view.asp'>必ずお読みください...
' データ接続を閉じます。
rs.close
rs=何も設定しない
OraSession=nothing を設定します
応答.終了
終了の場合
%>
<html>
<本文>
<フォームメソッド=POSTアクション=test.asp>
<p>ASP で Oracle の大きなフィールドにアクセスする際の問題の解決策:</p>
<p><textarea rows=13 name=textcols=104></textarea></p>
<p><input type=submit value=保存名=B1></p>
<入力タイプ=隠し名=ok 値=1>
</form>
</body>
</html>
2. データ呼び出しプログラム: view.asp
<%
'データベースに接続し、読み取り専用モードでデータテーブルを開きます
OraSession=CreateObject(OracleInProcServer.XOraSession) を設定します。
OraDatabase=OraSession.DbOpenDatabase(autop,system/manager,0) を設定します。
Set Rs=OraDatabase.DbCreateDynaset(ID desc,4 によるテスト順序から * を選択)
'初期値の割り当て: 各インターセプトのバイト サイズを 1024 バイトとして定義し、最大値は 65280 バイト (64K) に設定できます。
サイズ=65280
I=0
する
'Rs レコード セットの Fields オブジェクトの DbGetChunk メソッドを使用して、ループでデータを読み取ります
Text=Rs.Fields(Blob).DbGetChunk(I*サイズ,サイズ)
Response.write テキスト
'毎回取り出した詳細なデータバイト数を求める
Text_Size=Lenb(テキスト)
I=I+1
'毎回取り出したデータの詳細バイト数が、定義するインターセプトバイトサイズ未満であれば、データが完了したことを意味し、ループを抜けます。
Text_Size<Size までループします
'データ接続を閉じる
OraSession=nothing を設定します
%>
4. 追記:
データ型が長いため、ORACLE では、long の容量は 2GB 未満であると規定されていますが、読み取り時に最大 64K のコンテンツしか読み取れないことがわかりました。上記の方法の ASP 制限の影響を受けます。
皆さん、より多くの経験やより良い解決策をお持ちの場合は、ぜひお知らせください。