none
ADO.NET, условия для строки запроса RRS feed

  • Вопрос

  • Здравствуйте, написал как мог код с условиями что бы не путать словами, так работает
    public IEnumerable<Tasks> TaskSelect(int curId, int tagId, string date)
            {
                using (var sqlConn = SqlConnection())
                {
                    string sqlSel = "SELECT * FROM Tasks WHERE UsId = @UsId";
    
                    if (tagId != 0)
                    {
                        sqlSel = "SELECT * FROM Tasks AS t JOIN CrossTasksTags AS c ON (t.TaskId = c.TaskId) WHERE t.UsId = @UsId and c.TagsId = @TagsId ORDER BY c.TaskId";
                    }
                    if (date != "")
                    {
                        sqlSel = "SELECT * FROM Tasks AS t JOIN CrossTasksTags AS c ON (t.TaskId = c.TaskId) WHERE t.UsId = @UsId and t.TaskTerm = @TaskTerm ORDER BY c.TaskId";
                    }
                    if (tagId != 0 && date != "")
                    {
                        sqlSel = "SELECT * FROM Tasks AS t JOIN CrossTasksTags AS c ON (t.TaskId = c.TaskId) WHERE t.UsId = @UsId and c.TagsId = @TagsId and TaskTerm = @TaskTerm ORDER BY c.TaskId";
                    }
    
                    using (SqlCommand cmdSel = new SqlCommand(sqlSel, sqlConn))
                    {
    
                        cmdSel.Parameters.AddWithValue("@UsId", curId);
                        cmdSel.Parameters.AddWithValue("@TagsId", tagId);
                        if (date != "")
                        {
                            cmdSel.Parameters.Add("@TaskTerm", SqlDbType.Date).Value = date;
                        }
    
    
                        List<Tasks> query = new List<Tasks>();
                        using (SqlDataReader reader = cmdSel.ExecuteReader())
                        {
                            while (reader.Read())
                            {
                                query.Add(new Tasks()
                                {
                                    StatusString = GetStatusString(int.Parse(reader["StatusId"].ToString())),
                                    Description = reader["Description"].ToString(),
                                    TaskId = int.Parse(reader["TaskId"].ToString()),
                                    Title = reader["Title"].ToString(),
                                    Tags = reader["Tags"].ToString(),
                                    TaskTerm = DateTime.Parse(reader["TaskTerm"].ToString()),
                                    UsId = int.Parse(reader["UsId"].ToString())
    
                                });
                            }
                        }
                        return query;
                    }
                }



    Это ужасно когда столько условий переопределяют одну переменную с мало отличимым sql запросом, но не знаю как написать иначе, правильно и красиво, отрефакторите плз
    Разница лишь фильтре
    14 августа 2015 г. 14:04

Ответы

Все ответы

  • Это не код а кошмар :) Не пишите SQL в C#, это очень плохо и в плане безопасности. В данном случае вам нужна хранимая процедура, которая будет принимать три параметра, выполнять SQL логику и возвращать готовый результат.

    Сделаем содержимое сообщества лучше, вместе!

    14 августа 2015 г. 15:18
    Модератор
  • Это не код а кошмар :) Не пишите SQL в C#, это очень плохо и в плане безопасности. В данном случае вам нужна хранимая процедура, которая будет принимать три параметра, выполнять SQL логику и возвращать готовый результат.

    Сделаем содержимое сообщества лучше, вместе!

    Это мне в качестве задания, нужно на ADO.NET . А не могли бы набросать немного, так как правильно? = /

    • Изменено A1x1On 14 августа 2015 г. 16:57
    14 августа 2015 г. 16:26
  • К сожалению нет времени писать код :( Но прочти вот это обязательно, дальше будет легко.

    Сделаем содержимое сообщества лучше, вместе!

    30 августа 2015 г. 17:48
    Модератор