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 检查名称是不是已存在于数据库中的主要内容,如果未能解决你的问题,请参考以下文章

如何检查 AWS S3 中是不是已存在存储桶

如何在插入 MySQL 之前检查表中是不是存在名称 [重复]

使用 Python 检查标签是不是已存在于 Adwords 帐户中?

如何使用 ADO.NET 从数据库中获取对象?

Android - 检查元素是不是存在于 WebView 中(在 DOM 中)

检查数据库文件中是不是存在 ID 时出错