繁体   English   中英

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

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

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表中获取所有字段? 通常执行SELECT *并不是一个很好的做法,因为您可能正在获取您可能不需要的字段。 此外,如果将来在该表中添加更多列,由于 *(星号),这些字段也将被提取。 在这里,您可以在 StackOverflow 上获得该主题的完整答案

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

如果您不验证从 UI 传递的内容,然后将其直接放入查询中,则可以进行SQL Injection 如果这是生产代码,您应该尽一切努力避免它。 更多关于SQL 注射在这里

最后,我对改进代码的建议是在 SQL 语句中使用OR 在这里你可以找到如何做到这一点

它将类似于(仅将其作为指导,而不是完整的解决方案):

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

我希望它能为您提供一些关于如何改进它的提示。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM