frog.raindrop.jp.knowledge > IIS ASP
主にASPに関してです。ただし、ASPはあまり好きじゃないです。

December 25, 2003

レコードセット→XML→HTMLなレシピ

時間なし。ソースのみ。

<%
Dim strSQL
Dim strCon
Dim adoRec
Dim xmlDocXml
Dim xmlDocXsl

	'接続文字列
	strCon	= "Provider=SQLOLEDB;"
	strCon	= strCon & "Data Source=(local);"
	strCon	= strCon & "User ID=sa;"
	strCon	= strCon & "Password=pass;"
	strCon	= strCon & "Initial Catalog=Master;"
	
	'SQLを実行
	strSQL	= "SELECT * FROM MYTABLE"
	Set adoRec		= Server.CreateObject("ADODB.Recordset")
	adoRec.CursorLocation	= adUseClient
	Call adoRec.Open(strSQL, strCon, adOpenForwardOnly, adLockReadOnly, adCmdText)
	Set adoRec.ActiveConnection	= Nothing
	
	'xml作成
	Set xmlDocXml		= Server.CreateObject("MSXML2.DOMDocument")
	xmlDocXml.async		= False
	Call adoRec.Save(xmlDocXml, adPersistXML)
	Call adoRec.Close()
	
	'xsl読み込み
	Set xmlDocXsl	= Server.CreateObject("MSXML2.DOMDocument")
	xmlDocXsl.async	= False
	Call xmlDocXsl.load("template.xsl")

	'出力する
	Call Response.Write(xmlDocXml.transformNode(xmlDocXsl))
%>

December 8, 2003

Oracle クライアントとネットワーク コンポーネントが見つかりません。

UDLファイルを作成して、Microsoft OLE DB Provider for Oracleを使用してOracleに接続するテストを行い、成功することを確認したのですが・・・ASPより接続すると以下のエラー

-2147467259(Microsoft OLE DB Provider for Oracle)
Oracle クライアントとネットワーク コンポーネントが見つかりません。これらのコンポーネントは Oracle Corporation から提供され、Oracle Version 7.3.3 (またはそれ以降) のクライアント ソフトウェアの一部としてインストールされます。
プロバイダは、これらのコンポーネントがインストールされるまで機能しません。

原因は、c:\oracle\ora92 ディレクトリに、Administrators, Authenticated Users, SYSTEMのみアクセス許可になっていたためでした。IUSR_(コンピュータ名)を追加すると、接続可能になりました。

開発環境がFAT32、実機がNTFSだったのが敗因でした:-(

November 26, 2003

ADOでストアドを使う

ASPで書くのが面倒な処理はDB側でプロシージャにしておくと便利な場合がある。

MSDEでプロシージャを作ってASPから呼び出してみた。

'ASP
Dim adoCmd
Set adoCmd    = Server.CreateObject("ADODB.Command")
With adoCmd
    .CommandText                    = "pCheckValid"
    .CommandType                    = adCmdStoredProc
    Set .ActiveConnection           = adoConGRDB
    .Parameters("@emp_cd")          = strEmpCd
    .Parameters("@require_admin")   = "1"
    Call .Execute()
End With
If Not IsNull(adoCmd.Parameters("@ret_msg")) Then
    Call Response.Write(adoCmd.Parameters("@ret_msg"))
    Set adoCmd    = Nothing
    Exit Sub
End If

ポイントは、CommandText, CommandTypeを設定後にActiveConnectionを設定すること。そうしないと、パラメータがうまくバインドしない。(なんで?)

ちなみに、パラメータにEmptyを渡すとそのパラメータは「省略された」物として扱われる。ASPのCOOKIEやRequest.Formなどの初期値もEmptyなので、その値をパラメータとして渡す場合は、プロシージャ側で初期値を設定しておくのがお勧めである。

※ プロシージャ側でデフォルト値が指定されていないパラメータを省略すると実行時エラーになってしまう。

プロシージャの中身は、こんな感じ(実際に使ったものをいろいろ省略したため変なプロシージャだが)

続きを読む...

November 21, 2003

ブラウザのキャッシュを無効にする

お決まりのヘッダです。わたしは、これをたとえば"nocache.asp"などとして保存しておき、

Call Server.Execute("./nocache.asp")

などとしています。

<%@ Language=VBScript %><%
	'@@ キャッシュを無効にする
	With Response
		Call .AddHeader("Pragma", "no-cache")
		Call .AddHeader("Cache-control", "no-cache")
		.Expires = 0
		.CacheControl = "Private"
	End With
%>

November 19, 2003

ASPからコールするCOMコンポーネント

VBでASPからコールするActiveX DLLやActiveX EXEを作成する場合のポイントらしきものです。

  1. データ型

    ASPで使用するスクリプト言語は型がありません。したがって

    • 引数はByValで
    • ByRefで渡す引数はVariantに
    と言う感じにします。
  2. プロジェクトのプロパティ
    • 「対話型インターフェースの抑制」にチェック
    • 「メモリに保持」にチェック
    • スレッドモデル
      • スコープがApplication---シングル スレッド
      • スコープがSession-------アパートメントスレッド
      で作成します。このあたり、VC++で作成すると「Both」が選択できた気がしますが、VBでそれに当たるのはないのかな?
  3. ASP組み込みオブジェクトへのアクセス

    以下の2つに参照設定を行って、ASPからと同じように、Response.Writeでクライアントへの出力を行ったり、Request.ServerVariablesで環境変数を取得したりすることができます。

    • COM+ Services Type Library(Win2K以降の場合。9xやNTは)
    • Microsoft Active Server Pages Object Library

    ASP組み込みオブジェクトにアクセスするには、GetObjectContextメソッドを使います。Responseオブジェクトを例に取ると

    Dim aspResponse         As ASPTypeLibrary.Response
    
        Set aspResponse = GetObjectContext("Response")
        Call aspResponse.Write("Hello ASP!")
    		

    と言うような感じです。このとき、クラスのMTSTransactionModeプロパティが、"NotAnMTSObject"ではうまくいきませんでした。"Uses Transaction"にするとうまくいきましたが、どういう値であるべきかまでは調べていません。

    また、この処理を、Class_Initiarizeプロシージャに記述したオブジェクトを、Global.asa内で生成したり、アプリケーションスコープのobjectタグで宣言すると、うまく動作しないようです。

(04/01/24 追記)

Applicationスコープにするには、スレッドモデルがBothまたはNeutralのコンポーネントを作成する必要があります。つまり、VBで作成することはできません。

November 17, 2003

Server.Execute()

「006~ASP 0231~Server.Execute エラー~無効な形式の URL または完全認証されている絶対 URL が使用されました。相対 URL を使用してください。」に悩まされること半日、Server.Executeメソッドで、パスパラメータにクエリ文字列が使えるってのはウソ!ってな情報 [Microsoft Windows 2000 Serverドキュメント]を得ました。
正確にはこうらしいです

Server.Execute を呼び出す .asp ファイルで利用できる QueryString は実行 .asp ファイルで利用できるので、Server.Execute のパス パラメータに含まれる QueryString を渡す必要はありません。ただし、Path パラメータに含まれる別のクエリー文字列を渡すことはできません。

迷惑な・・・。

October 8, 2003

データバインド

2003/10/08現在の、MSDNライブラリの該当するドキュメント
おなじく英語版ドキュメント(情報多い)

これらはブラウザに依存しないサイト構築には向かないが、デモ画面には最適である。
後でASP等で実際に実装する際にもソースが流用しやすい。