時間なし。ソースのみ。
<% 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)) %>
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だったのが敗因でした:-(
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なので、その値をパラメータとして渡す場合は、プロシージャ側で初期値を設定しておくのがお勧めである。
※ プロシージャ側でデフォルト値が指定されていないパラメータを省略すると実行時エラーになってしまう。
プロシージャの中身は、こんな感じ(実際に使ったものをいろいろ省略したため変なプロシージャだが)
お決まりのヘッダです。わたしは、これをたとえば"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 %>
VBでASPからコールするActiveX DLLやActiveX EXEを作成する場合のポイントらしきものです。
ASPで使用するスクリプト言語は型がありません。したがって
以下の2つに参照設定を行って、ASPからと同じように、Response.Writeでクライアントへの出力を行ったり、Request.ServerVariablesで環境変数を取得したりすることができます。
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で作成することはできません。
「006~ASP 0231~Server.Execute エラー~無効な形式の URL または完全認証されている絶対 URL が使用されました。相対 URL を使用してください。」に悩まされること半日、Server.Executeメソッドで、パスパラメータにクエリ文字列が使えるってのはウソ!ってな情報 [Microsoft Windows 2000 Serverドキュメント]を得ました。
正確にはこうらしいです
Server.Execute を呼び出す .asp ファイルで利用できる QueryString は実行 .asp ファイルで利用できるので、Server.Execute のパス パラメータに含まれる QueryString を渡す必要はありません。ただし、Path パラメータに含まれる別のクエリー文字列を渡すことはできません。
2003/10/08現在の、MSDNライブラリの該当するドキュメント
おなじく英語版ドキュメント(情報多い)
これらはブラウザに依存しないサイト構築には向かないが、デモ画面には最適である。
後でASP等で実際に実装する際にもソースが流用しやすい。