Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/33.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在Asp.net C中登录时的IndexOutOfRangeException#_C#_Asp.net - Fatal编程技术网

C# 在Asp.net C中登录时的IndexOutOfRangeException#

C# 在Asp.net C中登录时的IndexOutOfRangeException#,c#,asp.net,C#,Asp.net,在我的Asp.Net应用程序中,在登录时,我首先对用户进行身份验证,然后在会话变量中获取一些重要信息,而且它也工作得很好。 然而,当会话到期后,我必须再次登录,然后在GetDetail()方法中显示IndexOutOfRangeException。这是我的登录按钮代码: protected void btnLogin_Click(object sender, EventArgs e) { Session["UserName"] = txtUserName.Text; string

在我的Asp.Net应用程序中,在登录时,我首先对用户进行身份验证,然后在会话变量中获取一些重要信息,而且它也工作得很好。 然而,当会话到期后,我必须再次登录,然后在
GetDetail()
方法中显示
IndexOutOfRangeException
。这是我的登录按钮代码:

protected void btnLogin_Click(object sender, EventArgs e)
{
    Session["UserName"] = txtUserName.Text;
    string DefaultYear = GetDefaultFinYear();
    if (DefaultYear != string.Empty)
    {
        DefaultYear = "connect" + DefaultYear;
        Connections.Init(DefaultYear);
        SqlDataAdapter adp = new SqlDataAdapter();
        try
        {
            adp = new SqlDataAdapter("CheckLogin_sp", Connections.Connection[Session["UserName"].ToString()]);
            adp.SelectCommand.Parameters.AddWithValue("@UserName", txtUserName.Text.Trim());
            adp.SelectCommand.Parameters.AddWithValue("@Pwd", txtPassword.Text.Trim());
            adp.SelectCommand.Parameters.AddWithValue("option", "Authenticate".Trim());
            adp.SelectCommand.CommandType = CommandType.StoredProcedure;
            if (Connections.Connection[Session["UserName"].ToString()].State == ConnectionState.Closed)
            {
                Connections.Connection[Session["UserName"].ToString()].Open();
            }
            SqlDataReader dr = adp.SelectCommand.ExecuteReader();

            if (dr.HasRows)
            {
                Session["value"] = "admin";
                dr.Close();
                dr.Dispose();
                GetDetails();
                Response.Redirect("~/Masters/home.aspx", false);
            }
            else
            {
                MessageBox.Show("Invalid Password");
                txtUserName.Text = string.Empty;
            }
            Connections.Connection[Session["UserName"].ToString()].Close();
            adp.Dispose();
        }
        catch (Exception ex)
        {
            Response.Write(ex.ToString());
        }
        finally
        {
            Connections.Connection[Session["UserName"].ToString()].Close();
            adp.Dispose();

        }
    }
    else
    {
        MessageBox.Show("Invalid UserName");
    }        
}
GetDetails()
方法:

private void GetDetails()
{
    SqlCommand cmd = new SqlCommand();
    SqlDataReader dr;
    cmd.Connection = Connections.Connection[Session["UserName"].ToString()];
    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "CheckLogin_sp";
    cmd.Parameters.AddWithValue("option", "GetDetails".Trim());
    cmd.Parameters.AddWithValue("UserName", txtUserName.Text);
    cmd.Parameters.AddWithValue("Pwd", txtPassword.Text);
    dr = cmd.ExecuteReader();
    while (dr.Read())
    {
        Session["Name"] = dr["name"].ToString();
        Session["CompanyName"] = dr["CompanyName"].ToString();
        Session["UserId"] = dr["Id"].ToString();
        Session["Center"] = dr["Center"].ToString();
        Session["ClientCode"] = dr["ClientCode"].ToString();
        Session["UserImage"] = dr["Image"].ToString();
        Session["CurrentDatabase"] = dr["CurrentDatabase"].ToString();
        Session["UserName"] = txtUserName.Text;
        Connections.BillReport = dr["BillReport"].ToString();
        Connections.DuesReport = dr["DuesReport"].ToString();            
        Connections.GeneralReport = dr["GeneralReport"].ToString();
        Connections.PendingReport = dr["PendingReport"].ToString();
        Connections.RadiologyReport = dr["RadiologyReport"].ToString();
        Connections.HistoReport = dr["HistoReport"].ToString();
    }
    cmd.Parameters.Clear();
    cmd.Dispose();
    dr.Close();
}
注意:-当我检查计算机中的临时文件时,我在15天内发现了6GB的临时文件。是因为临时文件的负载太重吗?还是我的代码有问题


有人能告诉我我在这里做错了什么吗?

当您试图访问(读/写)索引超出数组边界的数组元素时,会引发索引自动失效异常

根据您的问题,我猜您正在尝试读取或写入超出数组边界的一些数组元素

例如: 当您检索不存在的索引记录时,它与错误相关

查看数组中是否有5个元素,但当您尝试检索索引6处的记录时,它将生成类型为IndexOutOfRangeException的异常

请参阅此处了解更多详细信息

您可以尝试以下代码:

 while (dr.Read() != null){
        // code goes here.
     } 

     OR 

 while(dr.Read() != ''){
        // code goes here.
     }
如果未解决,则必须调试程序

尝试:


尝试改进您的代码,此代码不好,在while循环中,您正在分配会话变量。您能建议,什么应该是更好的代码吗?@ShaiwalTripathi您能告诉我您的会话过期代码以及您重定向到登录页面的位置吗?在我的母版页中,我在加载页面时使用了此代码,如果(会话[“value”]==null){response.redirect(“default.aspx”)}所以每当会话过期时,它都会重定向到default。aspx@Webruster我应该在GetDetails()方法的结尾使用dr.dispose()吗?请解释一下?我应该在GetDetails()方法的结尾使用dr.dispose();吗?你可以使用dr.close();而不是dr.dispose()吗;因为两个方法都执行相同的操作,但close()方法设置的超时时间很短。因此,我建议使用close()l方法。
while (dr.Read() != null)