0

私のページでは、データベースから値を取得し、DataTable に値を入力しています。mac次に、その値をIFの文字列と比較しています。クエリの条件に基づいて、フェッチされるレコードはなく、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();
            }
        }
4

3 に答える 3

0

null の結果をチェックする必要がある場合は、if ステートメントを別の if ステートメントでラップします。この if ステートメントは、他のことを行う前に、null の結果を簡単にチェックします。次のようなものは、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 ループを使用して再構築する方が良いかもしれません。

于 2013-05-15T08:25:53.320 に答える
0

If ステートメントで OR 条件を交換するだけです。

if (tab.Rows.Count != 0 || mac == tab.Rows[i]["Mac_id"].ToString())
{
    ...
    ...
}
于 2013-05-15T08:19:59.493 に答える
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 の場合はループ外で処理することをお勧めします。

于 2013-05-15T08:13:39.483 に答える