2015-03-03 83 views
0

我已经编写了代码来停止我的主键的重复。我有两张桌子。一张表保存公司的详细信息,另一张表保存其他详细信息。在保存公司详细信息的表格中,公司注册号码作为主键。它不应该重复。但是注册号码是另一张表格的外键,可以根据需要复制。为什么我的while循环中的'if'条件只检查一次?

这里是我的代码:

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

上执行的代码中,我得到下面的异常:

enter image description here

请帮帮我。提前致谢。

+0

什么是你的检查点,如果你调用相同的附加功能? – 2015-03-03 05:08:39

+0

你怎么知道它只被检查一次?顺便说一句,这是没有意义的,因为你只返回最后一个条件的结果 – chouaib 2015-03-03 05:11:50

+0

@chouaib我插入了一个断点来检查迭代。 – ProblemChild 2015-03-03 05:15:40

回答

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

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

+0

你怎么能说OP只检查最后一个元素? – 2015-03-03 05:14:59

+0

他写的代码,如果最后一个元素匹配,将返回1,如果不匹配,则返回0。中间元素的值不起作用。 – 2015-03-03 05:15:52

+0

杜!正确+1 :) – 2015-03-03 05:19:27

1

你有检查每一行的代码,并将check设置为零或基于该行的一个。

这意味着check将仅在最后行的循环出口处设置。

它需要更改为类似这样的事情,假设您需要两个(如果列表为空),一个(如果发现),如果没有则为零(从您当前的代码(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; 
} 

(一)你必须要小心,因为这里调用函数AddCompanyDetails花空单考虑。如果你想要一个空列表与“记录不存在”(它可能应该是)相同的对待,摆脱if块返回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);   
}