在我的页面中,我从数据库中获取一个值&填充DataTable中的值。然后我将这些值与IF中的mac
字符串进行比较。
根据Query中的条件,将不会获取任何记录,它会陷入IF条件并抛出No row at Position 0
异常,而不是进入Else部分。
我的代码是:
string mac = GetMac();
string Qry = "Select VUserid,Password from passtable where VUserid='" + UserName.Text + "' and Flag='A'";
string qry = "Select VUserid,Password from passtable where Flag='A'";
string strq = "Select Mac_id from Sysinfo Where Appflag='A'";
using (SqlConnection conn = new SqlConnection(ConfigurationManager.ConnectionStrings["EvalCon"].ConnectionString))
{
try
{
SqlCommand cmd = new SqlCommand(Qry, conn);
SqlCommand cmd1 = new SqlCommand(qry, conn);
SqlCommand cmd2 = new SqlCommand(strq, conn);
conn.Open();
SqlDataAdapter da = new SqlDataAdapter(cmd);
SqlDataAdapter daa = new SqlDataAdapter(cmd1);
SqlDataAdapter dap = new SqlDataAdapter(cmd2);
DataTable dt = new DataTable();
DataTable dtt = new DataTable();
DataTable tab = new DataTable();
da.Fill(dt);
daa.Fill(dtt);
dap.Fill(tab);
for (int i = 0; i < tab.Rows.Count; i++)
{
for (int x = 0; x <= dtt.Rows.Count - 1; x++)
{
if (mac == tab.Rows[i]["Mac_id"].ToString() || tab.Rows.Count != 0)
{
if (UserName.Text == dtt.Rows[x]["VUserid"].ToString() && Password.Text == dtt.Rows[x]["Password"].ToString())
{
Response.Redirect("~/Changepass.aspx");
break;
}
else
{
lblMessage.Visible = true;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Text = "Invalid Username or Password !!!";
}
}
else
{
lblMessage.Visible = true;
lblMessage.ForeColor = System.Drawing.Color.Red;
lblMessage.Text = "Invalid Access Point for Evaluation !!!";
}
}
}
}
finally
{
conn.Close();
conn.Dispose();
}
}
答案 0 :(得分:0)
首先,您可能希望为变量提供一些更有意义的名称。
另外,您可能希望将for循环更改为foreach循环:
foreach (DataRow tabRow in tab.Rows.Count)
{
foreach (DataRow dttRow in dtt.Rows.Count)
{
// logic here
// tab.Rows[i]["Mac_id"] becomes tabRow["Mac_id"]
// and
// dtt.Rows[x]["VUserid"] becomes dttRow["VUserid"]
// and so on...
}
}
这样一来,如果没有提取记录,就不会进入。
之后,您可能需要在进入循环之前检查RowCount > 0
上数据表的条件,如果RowCount为0,则需要在循环外执行。
答案 1 :(得分:0)
只需在If语句中交换OR条件:
if (tab.Rows.Count != 0 || mac == tab.Rows[i]["Mac_id"].ToString())
{
...
...
}
答案 2 :(得分:0)
如果需要检查null结果,我将if语句包装在另一个if语句中,该语句在执行任何其他操作之前对null结果进行简单检查。这样的东西会检查它是否为空:
if(tab.rows[i]["Mac_id"] != null)
{
//logic here
}
您可以将此添加到当前的if语句检查中:
if(mac == tab.Rows[i]["Mac_id"].ToString() || tab.Rows.Count != 0)
变为:
if(mac == tab.Rows[i]["Mac_id"].ToString() || tab.Rows.Count != 0 && tab.rows[i]["Mac_id"] != null)
尽管Tallmaris说使用foreach循环重组它可能会更好。