1. ホーム
  2. Web プログラミング
  3. プログラミング10000問

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