ADO.NET。使用id检查数据库中是否已经存在一个名字。

问题描述 投票:2回答:1

我有一个方法来检查一个名字是否已经存在于DB中。我现在做的方法是,首先我通过公司ID获取公司名称,然后我检查名称与我从 UI 作为一个param。

现在当前的代码是巨大的,有没有什么最简单的方法,或者我可以改进当前的代码。

 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# ado.net webapi
1个回答
1
投票

我想至少有几个方法可以使它更容易或改进你的代码.但让我建议几个 考虑 我认为这很重要。

... Do you need to fetch 的领域 公司信息 桌?SELECT * 并不是一个很好的做法,因为你可能会获取一些你不需要的字段。此外,如果将来有更多的列被添加到该表中,由于*(星号)的存在,这些字段也会被提取。该主题的完整答案在StackOverflow上。.

另一方面,根据你说的,关于: 从UI接收到的信息作为一个参数.

A SQL Injection 如果你不验证从UI传递过来的内容,然后直接把它放到你的Query中,那么就会出现这样的情况。如果是这样 生产代码 你应该尽量避免它。更多关于 这里有SQL注入.

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

它将会是类似于(只把它作为一个准则,而不是作为一个完整的解决方案)。

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

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


1
投票

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

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;
        }
© www.soinside.com 2019 - 2024. All rights reserved.