为什么我的while循环中的'if'条件只检查过一次?

时间:2015-03-03 05:05:25

标签: c# asp.net while-loop sqlexception

我已编写代码来停止复制主键。我有两张桌子。一个表保存公司详细信息,另一个表保存其他详细信息。在保存公司详细信息的表中,公司注册号被作为主键。它不应该重复。但是注册号是另一个表的外键,它可以根据需要进行复制。

这是我的代码:

public int checkComRegnumberAvailable(string conRegnumber)
{   
    int check = 2;
    int i = 0;

    List<OtherCompany> checklist = getCompanyDetails();

    while (i < checklist.Count)
    { 
        if (checklist[i].RegNumber != conRegnumber)
        {
            check = 0;
            i++;
        }

        else
        {
            check = 1;
            i++;
        }
    }

    return check; 
}

下面是我根据整数method的值执行SQL语句的check

public void AddCompanyDetails(int NDAid)
{
    using (SqlConnection con = new SqlConnection(cs))
    {
        int check = checkComRegnumberAvailable(oc.RegNumber);

        if (check == 0)
        {
            SqlCommand cmd = new SqlCommand("INSERT INTO OtherCompanyData (RegNumber,ComName,Country,Address,CoreBusi) values (@regnum,@comname,@country,@address,@corebusi) ", con);

            cmd.Parameters.AddWithValue("@regnum", oc.RegNumber);
            cmd.Parameters.AddWithValue("@comname", oc.ComName);
            cmd.Parameters.AddWithValue("@country", oc.Country);
            cmd.Parameters.AddWithValue("@address", oc.RegOfficeAddress);
            cmd.Parameters.AddWithValue("@corebusi", oc.CoreBuss);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
                AddNDADetails(NDAid);
            }

            catch (SqlException ex)
            {
                throw ex;
            }
        }

        else if (check == 1)
        {
            AddNDADetails(NDAid);
        }
    }
}

执行代码时,我得到以下异常:

enter image description here

请帮帮我。提前谢谢。

3 个答案:

答案 0 :(得分:2)

您希望您的代码在添加之前找出是否存在重复,但您实际所做的只是验证最后一个元素是否匹配。

相反,这样做:

public int checkComRegnumberAvailable(string conRegnumber)
{   
    int i = 0;

    List<OtherCompany> checklist = getCompanyDetails();
    foreach(var company in checklist)
    {
        if(company.RegNumber == conRegnumber)
        { 
            return 1;
        }
    }

    return 0;
}

有更好的方法来完成你正在做的事情,但这应该证明你当前逻辑中的问题。

答案 1 :(得分:1)

您检查的每一行代码都会根据该行将check设置为零或一行。

这意味着check将仅基于 last 行在循环退出处设置。

需要将其更改为这样的内容,假设如果列表为空则需要两个,如果找到则为一个,否则为零(如当前代码(a)中的情况那样):

public int checkComRegnumberAvailable (string conRegnumber) {   
    List<OtherCompany> checklist = getCompanyDetails();
    if (checklist.Count == 0)
        return 2;

    for (int i = 0; i < checkList.Count; i++)
        if (checklist[i].RegNumber == conRegnumber)
            return 1;

    return 0;
}

(a)你需要小心,因为调用函数AddCompanyDetails 考虑空列表。如果您希望将一个空列表与“记录不存在”(并且可能应该是)相同地处理,请删除返回if的{​​{1}}块。

答案 2 :(得分:0)

应该重新考虑代码。

首先,您只从结果中的getCompanyDetails()获取LAST元素。另外,为什么要在返回bool时返回int?只有在数组为空时才会返回2,并且您甚至都没有捕获该条件。

第一项改进:

public int checkComRegnumberAvailable(string conRegnumber)
{       
    List<OtherCompany> checklist = getCompanyDetails();

    foreach (var listItem in checklist)
    { 
        if (listItem.RegNumber == conRegnumber)
        {
            return 1;
        }
    }

    return 0; 
}

更好:

public bool checkComRegnumberAvailable(string conRegnumber)
{   
    return !getCompanyDetails().Any(cd => cd.RegNumber.Equals(conRegnumber));       
}

你的第二种方法应该是:

public void AddCompanyDetails(int NDAid)
{
    if (checkComRegnumberAvailable(oc.RegNumber))
    {
        using (SqlConnection con = new SqlConnection(cs))
        {             
            SqlCommand cmd = new SqlCommand("INSERT INTO OtherCompanyData (RegNumber,ComName,Country,Address,CoreBusi) values (@regnum,@comname,@country,@address,@corebusi) ", con);

            cmd.Parameters.AddWithValue("@regnum", oc.RegNumber);
            cmd.Parameters.AddWithValue("@comname", oc.ComName);
            cmd.Parameters.AddWithValue("@country", oc.Country);
            cmd.Parameters.AddWithValue("@address", oc.RegOfficeAddress);
            cmd.Parameters.AddWithValue("@corebusi", oc.CoreBuss);

            try
            {
                con.Open();
                cmd.ExecuteNonQuery();
            }

            catch (SqlException ex)
            {
                throw ex;
            }
        }
    }

    AddNDADetails(NDAid);        
}