我已编写代码来停止复制主键。我有两张桌子。一个表保存公司详细信息,另一个表保存其他详细信息。在保存公司详细信息的表中,公司注册号被作为主键。它不应该重复。但是注册号是另一个表的外键,它可以根据需要进行复制。
这是我的代码:
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);
}
}
}
执行代码时,我得到以下异常:
请帮帮我。提前谢谢。
答案 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);
}