none
新しいページへ変数を転送するに使うセッションの使い方について RRS feed

  • 質問

  • default.aspxからdetail.aspxへ変数を転送したいので、

    default.aspx.cs中に下のステートメントを記述しました。

        if (Oledbreader.Read())
                {
                    if (string.Compare(password, Oledbreader["usr_pass"].ToString(), true) != 0)
                        this.Label3.Text = "入力したパスワードが間違っていますので、やり直してください。";
                    else
                    {
                        Session["busyo_code"] = Oledbreader["busyo_cde"].ToString();
                        Session["busyo_alias"] = Oledbreader["busyo_als"].ToString();
                        Session["bumon_id"] = Oledbreader["bumon_cde"].ToString();
                        Server.Execute("Detail.aspx", true);
                        Response.Redirect("Detail.aspx", false);
                    }
                }
                else
                {
                    this.Label3.Text = "このユーザー名がまだ登録されていません。";
                }

     

    detail.aspx.cs中に下のステートメントを記述しました。

    protected void Page_Load(object sender, EventArgs e)
        {
            if(Session != null)
            {
                this.Label3.Text = Session["busyo_code"].ToString();
                this.Label4.Text = Session["busyo_alias"].ToString();
                bumon_id = Session["bumon_id"].ToString();
            }
        }

     

    デバッグすると、たまに(いつでもじゃなくて)例外が発生してしまいました。メッセージは下記の通りです。

    System.NullReferenceException はユーザー コードによってハンドルされませんでした。
      Message="オブジェクト参照がオブジェクト インスタンスに設定されていません。"
      Source="App_Web_97mbrg4n"
      StackTrace:
           場所 first.Page_Load(Object sender, EventArgs e) 場所 c:\Documents and Settings\ryuu-k\My Documents\Visual Studio 2008\WebSites\WebSite2\Detail.aspx.cs:行 22
           場所 System.Web.Util.CalliHelper.EventArgFunctionCaller(IntPtr fp, Object o, Object t, EventArgs e)
           場所 System.Web.Util.CalliEventHandlerDelegateProxy.Callback(Object sender, EventArgs e)
           場所 System.Web.UI.Control.OnLoad(EventArgs e)
           場所 System.Web.UI.Control.LoadRecursive()
           場所 System.Web.UI.Page.ProcessRequestMain(Boolean includeStagesBeforeAsyncPoint, Boolean includeStagesAfterAsyncPoint)
      InnerException:

     

    通じている方がいらっしゃいましたら是非助けてください!

    宜しくお願い致します。

    2008年8月18日 1:03

回答

  • メッセージの「Detail.aspx.cs:行 22」とは具体的にどの行ですか?

     

    Session["busyo_code"], Session["busyo_alias"], Session["bumon_id"] のいずれか
    が null になっているということはないですか?

     

    2008年8月18日 2:33
  • 基本的に、セッションから受け取ったら、値の検証(nullではないかどうか、値が正常が範囲に収まっているかなど)を行うのが一般的です。
    そのままプログラム内で直接使用することは、セキュリティ上好ましくありません。
    2008年8月18日 2:39
  •  gentone さんからの引用

     if (Oledbreader.Read())    //ここでNULL値かどうかのチェックが入ってますよね。

     

    Oledbreader.Read()が何だかはっきりわからないのですが、OleDbDataReader.Read メソッドだとすれば、NULL値のチェックにはなりません。テーブルにNULL値が保存してあればNULL値が読めてしまいます。きちんとチェックするのであれば、Oledbreader.Read()で読み取った値がNULLかどうかを判断しなければなりません。もしくはテーブルの当該列に、NULL値は保存できないオプションを付けます。

     

    結局、たまにNullReferenceExceptionが発生するのはオペレートのやり方だったのでしょうか? それならそれでいいのですが、Server.Executeを実行しているところも気になりました。

    2008年8月18日 5:01
    モデレータ
  • きちんとドキュメントを読めば、Readメソッドは次の行があるかどうかの戻り値を返すだけだと分かるはずです。
    行のそれぞれの列がnullかどうかは別の問題ですよね?
    2008年8月18日 5:05
  • レスを読んでいただいてないようで、何か聞く耳持たないって感じがしますけ
    ど、このスレッドを覗いたついでに一言。

     

    if(Session != null) で、

     

    Session["busyo_code"], Session["busyo_alias"], Session["bumon_id"]

    が null でないことを確認したことにはならないです。

     

    Session プロパティで返ってくるのは HttpSessionState オブジェクトへの参
    照ですから Session != null が何になるか分かりますか?

    2008年8月18日 7:24
  •  gentone さんからの引用

    Sessionは普通であるアレイだと思って、「Session != null」で使いました。

     

    返事が遅くなってしまい、すでに解決済みかもしれませんが・・・

     

    if(Session != null)

     

    となっているところを、

     

    if (Session["busyo_code"] != null && Session["busyo_alias"] != null && Session["bumon_id"] != null)

     

    のようにすれば、少なくとも System.NullReferenceException がスローさ
    れるという問題は解決できると思います。お試しください。

    2008年8月30日 5:45

すべての返信

  • メッセージの「Detail.aspx.cs:行 22」とは具体的にどの行ですか?

     

    Session["busyo_code"], Session["busyo_alias"], Session["bumon_id"] のいずれか
    が null になっているということはないですか?

     

    2008年8月18日 2:33
  • 基本的に、セッションから受け取ったら、値の検証(nullではないかどうか、値が正常が範囲に収まっているかなど)を行うのが一般的です。
    そのままプログラム内で直接使用することは、セキュリティ上好ましくありません。
    2008年8月18日 2:39
  • ご回答ありがとうございました。

     

     if (Oledbreader.Read())    //ここでNULL値かどうかのチェックが入ってますよね。
                {
                    if (string.Compare(password, Oledbreader["usr_pass"].ToString(), true) != 0)
                        this.Label3.Text = "入力したパスワードが間違っていますので、やり直してください。";
                    else
                    {
                        Session["busyo_code"] = Oledbreader["busyo_cde"].ToString();
                        Session["busyo_alias"] = Oledbreader["busyo_als"].ToString();
                        Session["bumon_id"] = Oledbreader["bumon_cde"].ToString();
                        Server.Execute("Detail.aspx", true);
                        Response.Redirect("Detail.aspx", false);
                    }
                }

    後は、デバッグすると、確かに値がNULLであります。調べると、

    default.aspx画面でuseridを取りたいんですが、デバッグ時useridを入力機会が貰わなかったで、

    直接detail.aspxの画面へ行っちゃいました。

     

    尚、default.aspxページのPage_Load()関数にはなにも記入しなかった。それは原因かなと思っているけど。。。

    2008年8月18日 4:22
  •  gentone さんからの引用

     if (Oledbreader.Read())    //ここでNULL値かどうかのチェックが入ってますよね。

     

    Oledbreader.Read()が何だかはっきりわからないのですが、OleDbDataReader.Read メソッドだとすれば、NULL値のチェックにはなりません。テーブルにNULL値が保存してあればNULL値が読めてしまいます。きちんとチェックするのであれば、Oledbreader.Read()で読み取った値がNULLかどうかを判断しなければなりません。もしくはテーブルの当該列に、NULL値は保存できないオプションを付けます。

     

    結局、たまにNullReferenceExceptionが発生するのはオペレートのやり方だったのでしょうか? それならそれでいいのですが、Server.Executeを実行しているところも気になりました。

    2008年8月18日 5:01
    モデレータ
  • きちんとドキュメントを読めば、Readメソッドは次の行があるかどうかの戻り値を返すだけだと分かるはずです。
    行のそれぞれの列がnullかどうかは別の問題ですよね?
    2008年8月18日 5:05
  • レスを読んでいただいてないようで、何か聞く耳持たないって感じがしますけ
    ど、このスレッドを覗いたついでに一言。

     

    if(Session != null) で、

     

    Session["busyo_code"], Session["busyo_alias"], Session["bumon_id"]

    が null でないことを確認したことにはならないです。

     

    Session プロパティで返ってくるのは HttpSessionState オブジェクトへの参
    照ですから Session != null が何になるか分かりますか?

    2008年8月18日 7:24
  • ご回答、本当にありがとうございました。

     

    Sessionは普通であるアレイだと思って、「Session != null」で使いました。

    貴兄のお話によると、多分間違ってるなあと、、、初心者ですが、宜しくお願い致します。

    2008年8月18日 8:24
  •  gentone さんからの引用

    Sessionは普通であるアレイだと思って、「Session != null」で使いました。

     

    返事が遅くなってしまい、すでに解決済みかもしれませんが・・・

     

    if(Session != null)

     

    となっているところを、

     

    if (Session["busyo_code"] != null && Session["busyo_alias"] != null && Session["bumon_id"] != null)

     

    のようにすれば、少なくとも System.NullReferenceException がスローさ
    れるという問題は解決できると思います。お試しください。

    2008年8月30日 5:45
  • こんにちは、フォーラムオペレータ大久保です。

     

    gentone さん、その後いかがでしょうか。

    SurferOnWww さんのアドバイスは参考になりましたでしょうか?

     

    その後が気になるところではあるのですが、多くの方にアドバイスをいただいておりますので、勝手ながらひとまず皆様の投稿に「回答済み」チェックをつけさせていただきました。

    まだ問題が残っているようでしたら、遠慮なく追加で投稿していただければと思います。

     

    それでは

    2008年9月12日 10:00