asp の RecordSet オブジェクトを使用した JScript での GetRows
2022-01-16 16:32:41
ASPのプログラムは必ずVBScriptで書かれていますが、それだけではなく、JScriptを使うこともできます。しかし、ASPの言語としてJScriptを使う場合、RecordSetのGetRowsメソッドなどVBScriptを使うよりも細かい部分で不便なことがあります。
プログラムの効率を重視するのであれば、RecordSetオブジェクトのGetRowsメソッドを使ってレコードセットオブジェクトを配列に変換すれば、RecordSetオブジェクトのMoveNextメソッドを使うよりはるかに高速に動作し、配列を取り出したらできるだけ早くRecordSetオブジェクトを解放して、レコード数を少なくすることも可能です。これもASPのパフォーマンスを最適化する方法です。
VBScriptのGetRowsメソッドは2次元配列で、その配列を走査することでデータを取得することができます。
今、mytableというテーブルとid,first,secondという3つのフィールドを持つデータベースがあるとします。
' code by xujiwei
' http://www.xujiwei.cn/
' Define variables
Dim conn,rs,data,recN,i
' Connect to the database
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
Server.MapPath("data.mdb")
' Get the recordset
Set rs=conn.Execute("SELECT id,first,second FROM mytable")
' Get an array of data
data=rs.GetRows()
' Close the recordset and free the object
rs.Close()
Set rs=Nothing
' Get the number of records
recN=UBound(data,2)
' Loop through the output data
For i=0 To recN
' Note that the array subscript starts at 0
' Display the data in the database
Response.Write("ID: "&data(0,i)&", First: "&data(1,i)&_
", Second: "&data(2,i)&"<br />")
Next
' Close the database connection and release the object
conn.Close()
Set conn=Nothing
%>
しかし、JScriptを使用する場合、JScriptには2次元配列がないという問題がある。GetRowsで取得したデータを利用する場合は、VBScriptでこの2次元配列をJScriptが認識できる配列、つまり要素が配列である1次元配列に変換する必要があります。
JScriptでは、GetRowsメソッドで取得した配列をJScriptで動作する配列に変換するtoArrayメソッドを持っていますが、この配列は1次元なので、VBScriptのように使うには、やはり自分で変換する必要があるわけです。
MSDNを調べたり、Webで関連記事を探したりして、JScriptでGetRowsメソッドを使用するための配列変換関数を書きました。
<script language="JScript" runat="server">
// code by xujiwei
// http://www.xujiwei.cn/
// Define variables
var conn,rs,vdata,data,recN,i;
// Connect to the database
conn=Server.CreateObject("ADODB.Connection");
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
Server.MapPath("data.mdb"));
// Get the recordset
rs=conn.Execute("SELECT id,first,second FROM test");
// Get an array of data and convert it to an array type available in JScript
vdata=rs.GetRows().toArray();
// Get the number of fields in the data table
i=rs.Fields.Count;
// Close the recordset and free the object
rs.Close();
rs=null;
// Convert the array
data=transArray(vdata,i);
// Get the number of records
recN=data.length;
// Loop through the output data
for(i=0;i<recN;i++) {
// Note that the array subscript starts at 0
// Display the data in the database
Response.Write("ID: "+data[i][0]+", First: "+data[i][1]+
", Second: "+data[i][2]+"<br />");
}
// Close the database connection and release the object
conn.Close();
conn=null;
// Array conversion functions
// by xujiwei
// Parameters: arr - the array of objects obtained by the GetRows method using the toArray method
// fieldslen - the number of fields in the data table
function transArray(arr,fieldslen) {
var len=arr.length/fieldslen,data=[],sp;
for(var i=0;i<len;i++) {
data[i]=new Array();
sp=i*fieldslen;
for(var j=0;j<fieldslen;j++)
data[i][j]=arr[sp+j];
}
return data;
}
</script>
更新頻度が低く、使用頻度の高い一部のデータについては、Applicationオブジェクトを使用して、データの取得に成功した後にデータ配列をキャッシュすることで、データベースへの問い合わせ回数を減らし、ASPの性能をある程度最適化することができます。
次のページへ http://www.xujiwei.cn/blog/?id=717
プログラムの効率を重視するのであれば、RecordSetオブジェクトのGetRowsメソッドを使ってレコードセットオブジェクトを配列に変換すれば、RecordSetオブジェクトのMoveNextメソッドを使うよりはるかに高速に動作し、配列を取り出したらできるだけ早くRecordSetオブジェクトを解放して、レコード数を少なくすることも可能です。これもASPのパフォーマンスを最適化する方法です。
VBScriptのGetRowsメソッドは2次元配列で、その配列を走査することでデータを取得することができます。
今、mytableというテーブルとid,first,secondという3つのフィールドを持つデータベースがあるとします。
コピーコード
コードは以下の通りです。
' code by xujiwei
' http://www.xujiwei.cn/
' Define variables
Dim conn,rs,data,recN,i
' Connect to the database
Set conn=Server.CreateObject("ADODB.Connection")
conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" &_
Server.MapPath("data.mdb")
' Get the recordset
Set rs=conn.Execute("SELECT id,first,second FROM mytable")
' Get an array of data
data=rs.GetRows()
' Close the recordset and free the object
rs.Close()
Set rs=Nothing
' Get the number of records
recN=UBound(data,2)
' Loop through the output data
For i=0 To recN
' Note that the array subscript starts at 0
' Display the data in the database
Response.Write("ID: "&data(0,i)&", First: "&data(1,i)&_
", Second: "&data(2,i)&"<br />")
Next
' Close the database connection and release the object
conn.Close()
Set conn=Nothing
%>
しかし、JScriptを使用する場合、JScriptには2次元配列がないという問題がある。GetRowsで取得したデータを利用する場合は、VBScriptでこの2次元配列をJScriptが認識できる配列、つまり要素が配列である1次元配列に変換する必要があります。
JScriptでは、GetRowsメソッドで取得した配列をJScriptで動作する配列に変換するtoArrayメソッドを持っていますが、この配列は1次元なので、VBScriptのように使うには、やはり自分で変換する必要があるわけです。
MSDNを調べたり、Webで関連記事を探したりして、JScriptでGetRowsメソッドを使用するための配列変換関数を書きました。
コピーコード
コードは以下の通りです。
<script language="JScript" runat="server">
// code by xujiwei
// http://www.xujiwei.cn/
// Define variables
var conn,rs,vdata,data,recN,i;
// Connect to the database
conn=Server.CreateObject("ADODB.Connection");
conn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+
Server.MapPath("data.mdb"));
// Get the recordset
rs=conn.Execute("SELECT id,first,second FROM test");
// Get an array of data and convert it to an array type available in JScript
vdata=rs.GetRows().toArray();
// Get the number of fields in the data table
i=rs.Fields.Count;
// Close the recordset and free the object
rs.Close();
rs=null;
// Convert the array
data=transArray(vdata,i);
// Get the number of records
recN=data.length;
// Loop through the output data
for(i=0;i<recN;i++) {
// Note that the array subscript starts at 0
// Display the data in the database
Response.Write("ID: "+data[i][0]+", First: "+data[i][1]+
", Second: "+data[i][2]+"<br />");
}
// Close the database connection and release the object
conn.Close();
conn=null;
// Array conversion functions
// by xujiwei
// Parameters: arr - the array of objects obtained by the GetRows method using the toArray method
// fieldslen - the number of fields in the data table
function transArray(arr,fieldslen) {
var len=arr.length/fieldslen,data=[],sp;
for(var i=0;i<len;i++) {
data[i]=new Array();
sp=i*fieldslen;
for(var j=0;j<fieldslen;j++)
data[i][j]=arr[sp+j];
}
return data;
}
</script>
更新頻度が低く、使用頻度の高い一部のデータについては、Applicationオブジェクトを使用して、データの取得に成功した後にデータ配列をキャッシュすることで、データベースへの問い合わせ回数を減らし、ASPの性能をある程度最適化することができます。
次のページへ http://www.xujiwei.cn/blog/?id=717
関連
-
webインタビュー よくある質問 httpキャッシュの解決関連
-
コンピュータネットワークの伝送プロトコルTCPの3つのハンドシェイクと4つの波の原理
-
推薦システムとは何か、その基本原理 ユースケース
-
Java、C/C++、JavaScript、PHP、Pythonはどのような開発に使われているのですか?
-
サイト外からのフォーム送信を無効にする(author:killer)
-
最新のロゴを時間別に表示する方法
-
URLのフォーマットが仕様に準拠しているかどうかを判断する方法は?
-
ASPページにExcelファイルを入れるには?
-
データベースのクエリ結果をページ内に表示するには?
-
POP3でメールを受信するには?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
IPv6とIPv4のアプリケーションの分析概要と相違点
-
直近の10人の訪問者を表示するには?
-
ユーザーが初めて私のサイトにアクセスしたことを検知し、フレンドリーなメッセージを表示するにはどうすればよいですか?
-
URLやメールアドレスをハイパーリンクに変換する方法とは?
-
レコードセットから色付きXMLファイルへの変換方法
-
オンデマンドで曲をオンライン実装する方法は?
-
ページめくり機能の書き方は?
-
あなたのウェブサイトの画像に違法なリンクを貼られないようにするには?
-
ASPでIndex Serverクエリオブジェクトを作成し、そのパラメータに値を割り当てるにはどうすればよいですか?
-
ページエラーやデータベース接続エラーの詳細をプログラムで教えてもらうことはできますか?