小さい頃はエラ呼吸

いつのまにやら肺で呼吸をしています。


Active Server Pages(レガシーasp)開発で学んだこと(2)

はじめに

僕は、会社に入社してから4年くらいの間、Active Server Pages(最近では、レガシーASPやクラシックASPと呼ばれる)を使ったアプリケーションの開発をしてきました。
昨年、Active Server Pages(レガシーasp)開発で学んだこと(1) - 大人になったら肺呼吸 はてなブックマーク - Active Server Pages(レガシーasp)開発で学んだこと(1) - 大人になったら肺呼吸というエントリを書いたのですが、今回は第二弾を書いてみたいと思います。
※VBScriptについての文法など、基礎的な部分は他に詳しいサイトがたくさんあるので、省略しています。

意外と知らないServer.CreateObjectとCreateObjectの違い

Server.CreateObjectとCreateObjectの違いは、ページ単位でのトランザクションをサポートするかどうか異なります。

VBScript の CreateObject 関数は、言語に用意された機能。
ASP の Server.CreateObject メソッドは、トランザクションに対応している (トランザクションに対応するには ASP の処理コンテキストを考慮しなければならないので、VBScript の標準機能には入れられない)。ということで、言語標準では対応できない部分をなんとかするために、各ホストが独自のオブジェクト生成機能を持っている、ということのようだ。逆に考えると、イベントハンドラもトランザクションもいらない場合は、CreateObject 関数でも問題ない (たぶん)。
2005-02-07 - sardineの日記 はてなブックマーク - 2005-02-07 - sardineの日記

UTF-8のファイルを読み書きするにはADODB.Streamを使う

Active Server Pagesでファイルを読み書きするには、FileSystemObjectを使用します。このFileSystemObjectは、ASCIIとUNICODE(UTF-16)の文字コードしかサポートしていません。UTF-8のファイルを読み書きするには、ADODB.Streamオブジェクトを使用します。
具体的なコードは、以下のエントリを参考にしてください。

ちなみにADODB.StreamオブジェクトでUTF-8のファイルを作成した場合、ファイルの先頭にBOMがついてしまいます。これを回避するには、ちょっとトリッキーなコードを書く必要があります。

標準のソート関数はないが、ADODB.Recordsetでソートができる

Active Server Pages(VBScript)には、標準のソート関数がありません。このため、プログラム内でソートを行う必要がある場合には、自作のソートプログラムを作成する必要があるのですが、ADODB.Recordsetオブジェクトを使用すると、簡単にソートを実現することができます。

ファイルパスの比較にテキストモードは使用してはいけない

文字列の比較を行う場合、StrComp関数やInstr関数を使用することがあります。
これらの関数には、バイナリモードとテキストモードの2種類の比較モードがありますが、テキストモードでファイルパスを比較してはいけません。理由はテキストモードの場合、大文字小文字違いを無視するのは良いのですが、全角半角違いの文字列までもが同じ文字として扱われてしまうためです。

Active Server Pagesでもファイルアップロードはできる

ファイルアップロードの仕組みは、ASP.NETでないと実現できないと思われる方もいるかと思いますが、クラシックASPでもADODB.Streamを使ってファイルアップロード機能は実現できます。

ただし、バイナリデータをゴリゴリ読み書きし、バイト単位でデータを扱う必要があるため、結構高度な知識が必要になると思います。