C# 在Asp.net C中登录时的IndexOutOfRangeException#
在我的Asp.Net应用程序中,在登录时,我首先对用户进行身份验证,然后在会话变量中获取一些重要信息,而且它也工作得很好。 然而,当会话到期后,我必须再次登录,然后在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
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)