ADO.NET: 使用 id 检查名称是否已存在于数据库中

ADO.NET: Check if a name already exists in database using id

我有一种方法可以检查某个名称是否已存在于数据库中。我现在这样做的方式是,首先我通过公司 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;
    }

我会选择类似的东西。调试它,因为我还没有完全测试它

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;
        }

我想至少有几种方法可以使它更容易或改进您的代码。 但让我提出一些我认为很重要的 考虑因素

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

另一方面,根据您所说的:从 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

我希望它能为您提供一些改进方法的提示。