none
Asp.net(C#)网站偶发性对象空,请问如何解决??? RRS feed

  • 问题

  • 具体情况如下:

          我的网站首页是一个登陆系统,当用户输入正确的ID和密码、验证码之后,程序先从数据库中去验证该ID的密码,如果验证成功就跳转到主界面。

          现在我遇到的情况是:

          网站运行情况基本都不错,每天偶尔会出现一次查询数据库为空的情况,就是无法取得数据库的值,每当这个问题出现之后,所有的用户都不能登陆了。只能IISRESET,然后就又恢复了,基本上每天会出现1-2次。

          具体获取的Exception如下:

         System.NullReferenceException: 未将对象引用设置到对象的实例。

         在 _Default.btn_login_Click(Object sender, ImageClickEventArgs e)

         btn_login_Click函数如下:

         protected void btn_login_Click(object sender, ImageClickEventArgs e)
        {
            try
            {
                lbl_err.Visible = false;
                string str_YZ = Session["VdtCode"] == null ? "" : Session["VdtCode"].ToString();
                if (InputValidator.IsSafeText(txt_username.Text.Trim()) && InputValidator.IsSafeText(txt_pwd.Text.Trim()))   //验证输入的字符是否安全
                {
                    if (txt_yzm.Text.Trim() != str_YZ)
                    {
                        lbl_err.Visible = true;
                        lbl_err.Text = "验证码错误";
                        txt_yzm.Text = "";
                        Session["VdtCode"] = "";
                        return;
                    }

                    string merchant_username = txt_username.Text.Trim();
                    string merchant_pwd = JIAMI(txt_pwd.Text.Trim());
                    string str_sql = "select top 1 MERCHANT_MOBILE,MERCHANT_NAME,MERCHANT_LIMIT_AMOUNT,MERCHANT_EMAIL,MERCHANT_TYPE,PARENT_MERCHANT,QUDAO_CODE,MERCHANT_IS_INTERFACE from MERCHANT where 1=1 and USERNAME='" + merchant_username + "' and MERCHANT_PWD='" + merchant_pwd + "'";//查询语句
                    ViewState["sql"] = str_sql;


                    CDataBaseDeal obj_db = new CDataBaseDeal();
                    SqlDataReader dr = obj_db.GetDataReader_Query(str_sql);
                    if (dr.Read())//每次到这里就抛出异常为空
                    {
                        string m_mobile = dr.GetString(0);
                        string m_name = dr.GetString(1);
                        decimal m_amount = dr.GetDecimal(2);
                        string e_email = dr.GetString(3);
                        string m_type = dr.GetString(4);
                        string p_m_mobile = dr.GetString(5);
                        string qd_code = dr.GetString(6);
                        string isinterface = dr.GetString(7);

                        //建立代理商信息类
                        CMerchant obj_merchant = new CMerchant(m_mobile, m_name, m_amount, e_email, m_type, p_m_mobile, qd_code, merchant_username, isinterface);
                        Session["MERCHANT"] = obj_merchant;
                        dr.Close();
                        Server.Execute("MainFrame.aspx");
                    }
                    else
                    {
                        lbl_err.Visible = true;
                        dr.Close();
                        txt_username.Text = "";
                        txt_pwd.Text = "";
                        txt_yzm.Text = "";
                    }
                }
            }
            catch (Exception err)
            {
                logger.debug("ERR==>" + ViewState["sql"].ToString());
                logger.debug(err.ToString());
            }

        }

    不知道有谁遇到和我相同的问题,有什么比较好的解决方案,这种问题本地真的调试不出来啊。。。

    2010年11月5日 2:47

答案

  • 应该是数据库不能连接导致的,连接使用完毕请立即关闭,以释放资源供其他访问者使用。

    也可能是iis资源不足,尽量少用Session等占用内存的东西,对象使用完毕立即释放,Dispose或者=null等


    【孟子E章】
    2010年11月5日 7:48
    版主

全部回复

  • 应该是数据库不能连接导致的,连接使用完毕请立即关闭,以释放资源供其他访问者使用。

    也可能是iis资源不足,尽量少用Session等占用内存的东西,对象使用完毕立即释放,Dispose或者=null等


    【孟子E章】
    2010年11月5日 7:48
    版主
  • 相同的代码在另外一台服务器中运行却一点问题都没有,而且IIS的设置都是默认的

    是否IIS某些设置可以比较好的避免此类问题的发生?

    2010年11月5日 10:14
  • CDataBaseDeal obj_db = new CDataBaseDeal();
                    SqlDataReader dr = obj_db.GetDataReader_Query(str_sql);
    你的 obj_db.GetDataReader_Query执行方法内部异常了,它内部可能是return null;
    @过&客@
    2010年11月16日 1:33