Можете ли вы передать строку SQL-запроса в контроллер Web API? - PullRequest
0 голосов
/ 23 мая 2018

Я пытаюсь создать форму, которая создает строку запроса SQL в зависимости от предпочтений поиска пользователей, а затем передает запрос контроллеру API, который получает данные из базы данных.

[Route("api/SelectionHelper/RiskGridView/{query}")]
    [HttpGet]
    public HttpResponseMessage RiskGridView(string query)
    {


        try
        {
            using (SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["Actor"].ConnectionString))
            {
                con.Open();


                using (SqlCommand cmd = new SqlCommand("SELECT * FROM Table WHERE key ='" + Constants.GlobalId + "'", con))
                {
                    DataTable dt = new DataTable();

                    SqlDataAdapter adp = new SqlDataAdapter(cmd);

                    adp.Fill(dt);


                    if (dt.Rows.Count == 0)
                    {
                        return Request.CreateErrorResponse(HttpStatusCode.BadRequest, "No active session found");
                    }
                    else
                    {

                        List<RiskSearch> list = new List<RiskSearch>();

                        cmd.CommandText = query;

                        SqlDataReader reader = cmd.ExecuteReader();

                        while (reader.Read())
                        {
                            list.Add(new RiskSearch()
                            {
                                QuoteRef = Convert.ToInt32(reader["ref"]),
                                PolicyRef = reader["reference"].ToString(),
                                Insured = reader["sap_ins_name"].ToString(),
                                QuoteStatus = reader["status"].ToString(),
                                Order = Convert.ToInt32(reader["recd"]),
                                InceptionDate = Convert.ToDateTime(reader["inception"]).ToShortDateString(),
                                PolicyType = reader["type"].ToString(),
                                Broker = reader["name"].ToString(),
                                QuoteStatusDate = Convert.ToDateTime(reader["date"]).ToShortDateString(),
                                RiskStatus = reader["status"].ToString()
                            });
                        }

                        return Request.CreateResponse(HttpStatusCode.OK, list);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            return Request.CreateErrorResponse(HttpStatusCode.BadRequest, ex);
        }

    }
}

Как был построен запрос

         if (txt_ref.Text != "")
        {
            SearchString += "[table].[field]" + 
CreatedFunctions.fct_SQL_WhereSearchStringText(txt_ref.Text);
        }
        if (txt_reference.Text != "")
        {
            SearchString += "[Table].[Field]" + 
CreatedFunctions.fct_SQL_WhereSearchStringText(txt_reference.Text);
        }
        if (txtPolicyGroup.Text != "")
        {
            SearchString += "[Table].[Field]" + 
 CreatedFunctions.fct_SQL_WhereSearchStringText(txt_Group_ref.Text);
        }
        if (txt__name.Text != "")

Я пытался передать запрос как строковую переменную в URL, но он выдает ошибку 404 или 400.

это правильный способ сделать это?Любой совет будет принята с благодарностью!

Ответы [ 2 ]

0 голосов
/ 23 мая 2018

Единственными системами, которые должны передавать SQL между слоями , являются инструменты SQL по своей сути (например, SEDE ).

Во всех других случаях вы почти наверняка должны передать некоторое DTO между слоями, представляющими доступные параметры поиска, например,

public HttpResponseMessage RiskGridView(string reference = null, string policyGroup = null, ... )

или через json с:

class SearchRequest {
    public string Reference {get;set;}
    public string PolicyGroup {get;set;}
    // ...
}

public HttpResponseMessage RiskGridView(SearchRequest query)

Теперь метод RiskGridView создаст требуемый SQL, используя параметры (не конкатенация).Вызывающая система не должна знать структуру таблицы .

. Я бы также настоятельно рекомендовал инструменты, такие как "Dapper", для фактического ее исполнения после того, как она была сконструирована:

...
if(opt.Reference != null) sql.Append(" and x.Reference=@Reference");
if(opt.PolicyGroup != null) sql.Append(" and x.PolicyGroup=@PolicyGroup");
//...
var results = connection.Query<RiskSearch>(sql.ToString(), opt); // handles params/reader

или используйте такой инструмент, как LINQ:

IQueryable<RiskSearch> rows = ctx.RiskSearch;
if(opt.Reference != null) rows = rows.Where(x => x.Reference == opt.Reference);
if(opt.PolicyGroup != null) rows.Where(x => x.PolicyGroup == opt.PolicyGroup);
// ...
var results = rows.Take(count).ToList();
0 голосов
/ 23 мая 2018

Передайте необходимую информацию в виде переменных строки запроса. Затем проверьте их работоспособность. Затем используйте хранимую процедуру и передайте их в качестве объектов параметров.

Еще лучше было бы использовать ORM, такой как Entity Framework.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...