ADO.NET:使用 id 检查名称是不是已存在于数据库中
Posted
技术标签:
【中文标题】ADO.NET:使用 id 检查名称是不是已存在于数据库中【英文标题】:ADO.NET: Check if a name already exists in database using idADO.NET:使用 id 检查名称是否已存在于数据库中 【发布时间】:2020-08-14 12:32:04 【问题描述】:我有一种方法可以检查数据库中是否已经存在名称。我现在这样做的方式是首先通过公司 ID 获取公司名称,然后使用从 UI
收到的名称作为参数检查名称。
现在当前的代码非常庞大,有没有最简单的方法可以做到这一点,或者我可以改进当前的代码。
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
BaseResponse response = new BaseResponse();
string existingCompanyName = null;
using (SqlConnection con = new SqlConnection(connectionString))
if (companyId != null)
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyID= " + companyId;
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
existingCompanyName = rdr["CompanyName"].ToString();
if (string.Equals(existingCompanyName, companyName))
response.Status = (int)Status.Failed;
else
response.Status = (int)Status.Success;
con.Close();
else
string sqlQuery = "SELECT * FROM CompanyInformation where CompanyName= '" + companyName + "'";
SqlCommand cmd = new SqlCommand(sqlQuery, con);
con.Open();
SqlDataReader rdr = cmd.ExecuteReader();
while (rdr.Read())
response.Status = (int)Status.Failed;
con.Close();
return response;
【问题讨论】:
【参考方案1】:我想至少有几种方法可以简化或改进您的代码。 但让我提出几个我认为很重要的注意事项:
¿ 您是否需要从 CompanyInformation 表中获取 所有 字段?
通常执行SELECT *
并不是一个很好的做法,因为您可能正在获取您可能不需要的字段。此外,如果将来向该表中添加更多列,由于 *(星号),这些字段也将被提取。
在这里你有一个complete answer to that topic on ***。
另一方面,根据您所说的:从 UI 作为参数接收。
如果您不验证从 UI 传递的内容,然后将其直接放入查询中,则可以创建 SQL Injection
。如果这是生产代码,您应该尽量避免使用它。更多关于SQL Injection in here。
最后,我对改进代码的建议是在 SQL 语句中使用 OR。 Here you can find how to do that
它将类似于(仅将其作为指导,而不是完整的解决方案):
SELECT column1, column2 -- the Columns that you really need to fetch
FROM CompanyInformation
WHERE CompanyID= companyId OR CompanyName= 'companyName' --you need to pass this properly
我希望它能给你一些关于如何改进它的提示。
【讨论】:
【参考方案2】:我会选择类似的东西。调试它,因为我没有完全测试它
public BaseResponse CheckDupliateCompany(string companyName, string companyId)
BaseResponse response = new BaseResponse() Status = (int)Status.Success;
string sqlQuery = "SELECT Count(*) FROM CompanyInformation where ";
SqlParameter param;
if (companyId != null)
param = new SqlParameter("@companyId", companyId);
sqlQuery += "CompanyId = @companyId";
else
param = new SqlParameter("@companyName", companyName);
sqlQuery += "CompanyName = @companyName";
using (SqlConnection con = new SqlConnection(_connectionString))
SqlCommand cmd = new SqlCommand(sqlQuery, con);
cmd.Parameters.Add(param);
con.Open();
int count = (int)cmd.ExecuteScalar();
if (count > 0)
response.Status = (int)Status.Failed;
con.Close();
return response;
【讨论】:
谢谢你会试试这个,但你忘了匹配字符串以上是关于ADO.NET:使用 id 检查名称是不是已存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章
如何在插入 MySQL 之前检查表中是不是存在名称 [重复]
使用 Python 检查标签是不是已存在于 Adwords 帐户中?