Response.Redirectで、別ASPに飛びません。

[上に] [前に] [次に]
じゅん 1999/12/08(水) 11:24:33
ログイン画面で入力した、社員コード、パスワードを、別ASPでチェックしています。

ログインチェックASPで、ADOのエラー時に、ログイン画面へResponse.Redirectで
飛ばしたいのですが、そのまま処理が流れてしまいます。

以下、ログインチェック.aspのプログラム
<%
                ・
                ・
On Error Resume Next
Err.Clear 'Errオブジェクトのクリア

Set LcObjConn = server.CreateObject("ADODB.Connection")
LcObjConn.Open("ODBC")

If Err.Number <> 0 Then
    'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)

    LcObjConn.Close
    Set LcObjConn = Nothing

    Call SbErrorProc("エラーです")

End If
                 ・
                 ・
                 ・
Sub SbErrorProc(LcStrMsg)

'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
    Session("SeMsg") = LcStrMsg
    Session("SeErrMsg") =  "詳細情報:" & Err.description & "(" & Err.number & ")"

    Response.Redirect "ログイン.asp"

End Sub
%>

具体的な現象は、ODBCのオープンエラーが発生した場合、Err.Numberが0以外になるので、
SbErrorProcを呼びます。

SbErrorProcの中では、Sessionオブジェクトにエラー情報を設定します。
本来ならば、ログイン.aspにリダイレクトして、エラー情報を表示すると思ったのですが、ログイン.aspに
リダイレクトせず、ログインチェック.aspの処理を続行しています。

Response.Redirectの後に、Response.Endを追加してみましたが、ダメでした。

記述に間違いがあるのでしょうか?
また、Response.Redirectを使用する場合、注意点はありますか?

開発環境は、NT4.0SP4 + IIS4.0 + VBScript です。

よろしくお願いします。

うぐいす 1999/12/08(水) 12:07:14
特に間違っているように感じませんので確認です。

>If Err.Number <> 0 Then
Err.Numberには、ちゃんと0以外の値が入ってますか?
Err.Raiseを使えば、強制的にエラーを発生させることが出来ます。

>Response.Redirect "ログイン.asp"
ファイル名は半角英数字のほうが良いと思います。
説明のために2バイト文字にされているのでしたら、すみません。

>NT4.0SP4 + IIS4.0 + VBScript
私の開発環境も同じですが、Response.Redirectは実行されています。

通りすがりの若輩もの 1999/12/08(水) 12:36:30
こんちわ。
サブルーチンをコールして、サブルーチン内でRedirectしているのが、
キモかもしれません。
サブールーチンを止めて直接記述してみてどうなるか、試してみては
いかがでしょうか。

ちなみに、ただ単にRedirectすることは出来ているのですよね。
一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
でRedirectしようとしてエラーが出る事ですが、この点に関しては、
大丈夫でしょうか。

あの、ちなみに後学のために教えて欲しいのですが、
>Set LcObjConn = server.CreateObject("ADODB.Connection")
>LcObjConn.Open("ODBC")
この部分のエラーをトラップする目的とは、何なのでしょう?
どういう要因でエラーが発生すると想定されているのですか?

じゅん 1999/12/08(水) 13:53:53
うぐいすさん、通りすがりの若輩ものさん、早速のレスありがとうございました。

頂いたアドバイスを試してみました。

>Err.Numberには、ちゃんと0以外の値が入ってますか?

Err.Numberは、0以外が入っていました。

>ファイル名は半角英数字のほうが良いと思います。

半角英数字にしてみましたが、ダメでした。

>サブールーチンを止めて直接記述してみてどうなるか、試してみては
>いかがでしょうか。

お〜、動きました。
そうすると、サブルーチン内でのResponse.Redirectが原因なんでしょうか?
エラー処理を共通化したかったので、サブルーチンにしたのですが、直接、記述することにします。
これって、VBScriptの仕様ですかね。(^^;

それとも、スクリプトエンジンのバージョンをアップすると直るとか。
忘れましたが、NT WorkStationのPWSで、IE4.0sp1の環境です。

あの、うぐいすさんにお願いしたことがあります。
うぐいすさんの環境で、サブルーチンをコールして、サブルーチン内でのResponse.Redirectは動くか確認できますか?

通りすがりの若輩ものさんに、お聞きしたことがあります。
>一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
>でRedirectしようとしてエラーが出る事ですが、この点に関しては、
>大丈夫でしょうか。

というのは、具体的にどのような処理のことですか?

再質問して申し訳ありませんが、よろしくお願いします。


>この部分のエラーをトラップする目的とは、何なのでしょう?
>どういう要因でエラーが発生すると想定されているのですか?

の件ですが、ODBCのデータソース名の変更し忘れや、ODBCを間違って削除した場合を想定して付けました。
実際の運用では、皆無に等しいエラーかもしれません。
一応、念のために付けてみました。(^^;

でも、良く考えると、ここに、エラートラップがなくてもコネクションが無いので、
それ以降のADO関連の処理でエラーとなるため、必要ないかもしれませんね。

うぐいす 1999/12/08(水) 15:13:46
>うぐいすさんの環境で、サブルーチンをコールして、サブルーチン内でのResponse.Redirectは動くか確認できますか?
すでにあるソースを使いましたので、CreateObjectは使用していないのですが、
<%
if errflg <> 0 then
 call aaa()
end if
sub aaa()
 response.redirect "input.html"
end sub
%>
としてみたところ、正常に動いております。
サブルーチン化してもresponse.redirectには影響がないようです。

通りすがりの若輩もの 1999/12/08(水) 16:44:25
私も気になって試しましたが、うぐいすさんのおっしゃる通り、
サブルーチン内でResponse.Redirectしても何ら問題無く動作してしま
いました。
サブルーチン内でも、Redirect先が無いとか、後述のヘッダー情報書き
込み後のRedirectも試しましたが、ブラウザで正しくエラーが表示され
ているので、もっと根本的なところで勘違いされているのかも知れま
せん。ロジック処理フローでの勘違いとか。^^;

環境についてですが、
>NT4.0SP4 + IIS4.0 + VBScript
ではなかったの?
うちは、NT4.0SP4 + IIS4.0 + VBScript3.1です。

うぐいすさんご指摘の日本語ファイル名の件は、本件とは直接関係しな
いが、一般論として、URL部分に日本語が含まれているのはいかがな
ものか、と言う事だと思います。
理由は分かりませんが、今後の為にも使わないほうが無難では?

>一般によくやるミスは、すでに何らかの情報をクライアントを渡した後
>でRedirectしようとしてエラーが出る事ですが、この点に関しては、
>大丈夫でしょうか。

具体的にソースで示します。
次に示すa.aspはRedirectされますが、b.aspはエラーとなってしまい
ます。<HTML>タグの前で処理するか、Response.buffer=trueとして
aspの最後の処理が終るまで、クライアントに何も返さないようにして
あげることが必要です。
実際に試してみるとよく分かると思います。

-----   a.asp -----
<%@ LANGUAGE = VBScript %>
<%
if Request.form("B1")="記憶させちゃう" then
      Session("PRA_UID") = Request.form("PRA_UID")
else
      Session("PRA_UID") = ""
      Response.Redirect "test.asp"
end if

%>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>おまけ</title>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
ほげほげ<br>
</body>
</html>
-----   a.asp 以上   -----


-----   b.asp -----
<%@ LANGUAGE = VBScript %>
<%
Response.buffer=true
'この1行があればb.aspもエラーにならない

if Request.form("B1")="記憶させちゃう" then
      Session("PRA_UID") = Request.form("PRA_UID")
else
      Session("PRA_UID") = ""
end if

%>
<!DOCTYPE HTML PUBLIC "-//IETF//DTD HTML//EN">
<html>
<head>
<title>おまけ</title>
<meta http-equiv="Content-Type" content="text/html; charset=x-sjis">
</head>
<body>
<%
if Session("PRA_UID") = "" then
      Response.Redirect "test.asp"
end if
%>
ほげほげ<br>
</body>
</html>
-----   b.asp 以上   -----

あっ、それから今気がつきましたが、IISの設定でクライアントに
エラーメッセージを表示させないという設定(デフォルトではない)
になっていると何もエラーが表示されないかも知れません。
これはこちらでは運用上設定変更できないのでご容赦を。
それでは。

うぐいす 1999/12/08(水) 16:58:37
>通りすがりの若輩もの
>うぐいすさんご指摘の日本語ファイル名の件は、本件とは直接関係しないが、
>一般論として、URL部分に日本語が含まれているのはいかがなものか、と言う事だと思います。
そのとおりです。(^^;)
言葉足らずですみません。
通りすがりの若輩ものさん、フォロー有難うございました。m(__)m

うぐいす 1999/12/08(水) 17:00:12
すみません。
なんか慌てて書込みしたので、敬称が抜けてしまいました。
通りすがりの若輩ものさん、本当に申し訳ありません。

通りすがりの若輩もの 1999/12/08(水) 17:39:02
とんでもないですぅ。>うぐいすさん

前述のb.aspですが、そのままではRedirectされてしまいます。
Response.buffer=true
をコメントアウトするとエラーになります。
#慌てて書き込みしたもので。^^;

#ペンネームが長くて一覧表示のテーブルがぶざまになってしまい、
恐れ入りますです。>みなさま

じゅん 1999/12/08(水) 18:05:03
うぐいすさん、通りすがりの若輩ものさん、ご丁寧な回答ありがとうございます。

とても参考になりました。

あれから、色々と調べました。
通りすがりの若輩ものさんのご指摘の通り、私のプログラムミスでした。
申し訳有りませんでした。m(__)m

以下のようにスクリプトを修正したら、正常に動作ました。

修正したログインチェック.aspのプログラム
<%
                ・
                ・
On Error Resume Next
Err.Clear 'Errオブジェクトのクリア

Set LcObjConn = server.CreateObject("ADODB.Connection")
LcObjConn.Open("ODBC")

If Err.Number <> 0 Then
    'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)

'コネクションのCloseをコメント
'    LcObjConn.Close
    Set LcObjConn = Nothing

    Call SbErrorProc("エラーです")

End If
                 ・
                 ・
                 ・
Sub SbErrorProc(LcStrMsg)

'エラー情報をSessionオブジェクトに設定(ログイン画面に表示する)
    Session("SeMsg") = LcStrMsg
    Session("SeErrMsg") =  "詳細情報:" & Err.description & "(" & Err.number & ")"

    Response.Redirect "ログイン.asp"

End Sub
%>

何が原因だったかと言いますと、LcObjConn.Close が悪さしていました。
LcObjConn.Openが成功していないのに、クローズしたためです。

おそらく、On Error Resume Nextを指定しているので、リダイレクトせず、ログインチェック.aspの処理を続行
していると思われます。

試しに、レコードセットのオープンに失敗して、エラートラップ処理で、レコードセットのクローズを
実行した場合もリダイレクトしませんでした。

度々、質問して申し訳有りません。
コネクション、レコードセットは、Closeしなくても良いものでしょうか?
NothingをセットするだけでOKですか?

[上に] [前に] [次に]