ADO. NET: Проверьте, существует ли имя в базе данных, используя идентификатор - PullRequest
2 голосов
/ 30 апреля 2020

У меня есть метод, чтобы проверить, существует ли имя в БД или нет. То, как я делаю это сейчас, это сначала я получаю название компании по идентификатору компании, затем я проверяю имя с именем, которое я получаю от 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;
    }

Ответы [ 2 ]

1 голос
/ 30 апреля 2020

Я думаю, что есть несколько способов, по крайней мере, сделать это проще или улучшить ваш код. Но позвольте мне предложить пару соображений , которые я считаю важными:

¿Вам нужно выбрать все поля из CompanyInformation Таблица? Обычно выполнение SELECT * не совсем хорошая практика, так как вы можете выбирать поля, которые вам могут не понадобиться. Кроме того, если в будущем в эту таблицу будет добавлено больше столбцов, эти поля также будут выбраны из-за * (звездочка). Здесь у вас есть полный ответ на этот топи c в StackOverflow .

С другой стороны, на основании того, что вы сказали о: получении от пользовательского интерфейса в качестве параметра .

A SQL Injection можно создать, если вы не проверяете то, что передается из пользовательского интерфейса, а затем помещаете это непосредственно в свой запрос. Если это производственный код , вам следует избегать его всеми средствами. Подробнее о 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

I надеюсь, он даст вам несколько советов о том, как его улучшить.

1 голос
/ 30 апреля 2020

Я бы 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;
        }
...