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

Why is the 'if' condition in my while loop only checked once?

我已经编写了代码来停止复制我的主键。我有两个 table。一个 table 保存公司详细信息,另一个 table 保存其他详细信息。在保存公司详细信息的 table 中,公司注册号作为主键给出。它不应该被复制。但是注册号是另一个table的外键,可以在其中复制任意数量。

这是我的代码:

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 ,我根据整数 check 的值执行 SQL 语句:

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);
        }
    }
}

执行代码时出现以下异常:

请帮助我。提前致谢。

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

相反,这样做:

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;
}

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

您的代码会检查每一行并根据该行将 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 not 将空列表放入帐户。如果您希望将空列表与 "record does not exist" 相同对待(并且可能应该如此),请删除 returns 2.[=16= 的 if 块]

有很多问题需要重新考虑代码。

首先,您只会从结果中的 getCompanyDetails() 获取最后一个元素。另外,为什么你 return 一个 int 而你应该 return 一个 bool?您的 return of 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);        
}