トップ回答者
新しいページへ変数を転送するに使うセッションの使い方について

質問
-
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:通じている方がいらっしゃいましたら是非助けてください!
宜しくお願い致します。
回答
-
gentone さんからの引用 if (Oledbreader.Read()) //ここでNULL値かどうかのチェックが入ってますよね。
Oledbreader.Read()が何だかはっきりわからないのですが、OleDbDataReader.Read メソッドだとすれば、NULL値のチェックにはなりません。テーブルにNULL値が保存してあればNULL値が読めてしまいます。きちんとチェックするのであれば、Oledbreader.Read()で読み取った値がNULLかどうかを判断しなければなりません。もしくはテーブルの当該列に、NULL値は保存できないオプションを付けます。
結局、たまにNullReferenceExceptionが発生するのはオペレートのやり方だったのでしょうか? それならそれでいいのですが、Server.Executeを実行しているところも気になりました。
-
gentone さんからの引用 Sessionは普通であるアレイだと思って、「Session != null」で使いました。
返事が遅くなってしまい、すでに解決済みかもしれませんが・・・
if(Session != null)
となっているところを、
if (Session["busyo_code"] != null && Session["busyo_alias"] != null && Session["bumon_id"] != null)
のようにすれば、少なくとも System.NullReferenceException がスローさ
れるという問題は解決できると思います。お試しください。
すべての返信
-
ご回答ありがとうございました。
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()関数にはなにも記入しなかった。それは原因かなと思っているけど。。。
-
gentone さんからの引用 if (Oledbreader.Read()) //ここでNULL値かどうかのチェックが入ってますよね。
Oledbreader.Read()が何だかはっきりわからないのですが、OleDbDataReader.Read メソッドだとすれば、NULL値のチェックにはなりません。テーブルにNULL値が保存してあればNULL値が読めてしまいます。きちんとチェックするのであれば、Oledbreader.Read()で読み取った値がNULLかどうかを判断しなければなりません。もしくはテーブルの当該列に、NULL値は保存できないオプションを付けます。
結局、たまにNullReferenceExceptionが発生するのはオペレートのやり方だったのでしょうか? それならそれでいいのですが、Server.Executeを実行しているところも気になりました。
-
gentone さんからの引用 Sessionは普通であるアレイだと思って、「Session != null」で使いました。
返事が遅くなってしまい、すでに解決済みかもしれませんが・・・
if(Session != null)
となっているところを、
if (Session["busyo_code"] != null && Session["busyo_alias"] != null && Session["bumon_id"] != null)
のようにすれば、少なくとも System.NullReferenceException がスローさ
れるという問題は解決できると思います。お試しください。