【问题标题】: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;
    }

【问题讨论】:

    标签: c# sql ado.net webapi


    【解决方案1】:

    我想至少有几种方法可以简化或改进您的代码。 但让我提出几个我认为很重要的注意事项

    ¿ 您是否需要从 CompanyInformation 表中获取 所有 字段? 通常执行SELECT * 并不是一个很好的做法,因为您可能正在获取您可能不需要的字段。此外,如果将来向该表中添加更多列,由于 *(星号),这些字段也将被提取。 在这里你有一个complete answer to that topic on StackOverflow

    另一方面,根据您所说的:从 UI 作为参数接收

    如果您不验证从 UI 传递的内容,然后将其直接放入查询中,则可以创建 SQL Injection。如果这是生产代码,您应该尽量避免使用它。更多关于SQL Injection in here

    最后,我对改进代码的建议是在 SQL 语句中使用 ORHere 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;
              }
      

      【讨论】:

      • 谢谢你会试试这个,但你忘了匹配字符串
      猜你喜欢
      • 2015-12-16
      • 2021-12-19
      • 1970-01-01
      • 2021-12-15
      • 2021-11-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多