为什么我的 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);
}
我已经编写了代码来停止复制我的主键。我有两个 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);
}