Передача результата запроса хранимой процедуры из JSonResult в Ajax

Добрый день! Я пытаюсь отобразить результат запроса хранимой процедуры в текстовое поле на моей странице. Эта хранимая процедура возвращает только один результат — продажи за день. Я пытаюсь сделать это через JSonresult, чтобы передать его ajax на моей странице просмотра. Но мне не удалось его пройти.

У меня есть таблица с именем ORDER, в которой есть столбцы ORDER_DATE и NET_AMOUNT. Мне нужно отобразить сумму net_amount за текущий день. Вот мой запрос:

SELECT SUM(NET_AMOUNT) AS DAILY_SALES
FROM [ORDER]
WHERE ORDER_DATE = GETDATE()

Затем я вызываю эту хранимую процедуру в моем контроллере с помощью этого метода:

        public JsonResult GetSalesToday()
        {
            DataTable dtTable = new DataTable();
            List<string> lstSales = new List<string>();


            string strQuery = "SP_DAILY_SALES";

            SqlConnection con = new SqlConnection(ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString());
            SqlCommand cmd = new SqlCommand(strQuery, con);
            cmd.CommandType = CommandType.StoredProcedure;
            SqlDataAdapter da = new SqlDataAdapter(cmd);
            da.Fill(dtTable);


            foreach (DataRow row in dtTable.Rows)
            {
                lstSales.Add(row["DAILY_SALES"].ToString());
            }


            var DailySales = new
            {
                SALESTODAY = lstSales
            };


            return Json(DailySales, JsonRequestBehavior.AllowGet);

        }		

а затем вызовите его на мой взгляд следующим образом:

  $.ajax(
                       {
                           datatype: "json",
                           type: "POST",
                           url: "/Sales/GetSalesToday",
                           data: JSON,
                           success: function (data) {
                               DailySales(data);
                           },
                           error: function () { alert("Error"); }
                       });

Как я могу вызвать это в свое текстовое поле?

 <div class="form-group">
                                @Html.LabelFor("DailySales", "Sales", htmlAttributes: new { @class = "col-xs-4 col-sm-offset-1 col-sm-4" })
                                <div class="col-lg-6 col-lg-6 col-md-6 col-md-6 col-sm-6 col-sm-6 col-xs-6 col-xs-6">
                                    @Html.TextBoxFor("DailySales", new { @class = "form-control" })
                                    @Html.ValidationMessageFor("DailySales", "", new { @class = "text-danger" })
                                </div>
                            </div>

Где я ошибаюсь? Может ли кто-нибудь помочь мне в этом? Заранее спасибо!


person Kylie Irwin    schedule 11.08.2016    source источник
comment
Что возвращает SP_DAILY_SALES sp? Каково значение DailySales?   -  person Shyju    schedule 11.08.2016
comment
что делает функция DailySales(data);?   -  person JamieD77    schedule 11.08.2016
comment
@Shyju возвращает СУММУ (NET_AMOUNT) как DAILY_SALES, которую я затем передаю в lstSales. Я создал переменную DailySales и присвоил lstSales другой переменной SALESTODAY. DailySales — это то, что я передаю в ajax, на мой взгляд.   -  person Kylie Irwin    schedule 11.08.2016


Ответы (2)


Если вам нужна сумма, просто оставьте для нее переменную и верните ее.

decimal total = 0.0M;

foreach (DataRow row in dtTable.Rows)
{
   total  += Convert.ToInt32(row["DAILY_SALES"]);
}

return Json(total,JsonRequestBehaviour.AllowGet);

и в обратном вызове успешного вызова ajax прочитайте значение и назначьте его текстовому полю, используя метод jQuery val().

 success: function (data){
                           $("#DailySales").val(data);
                         },

Если ваша хранимая процедура возвращает одно скалярное значение, вам не нужно перебирать строку данных в цикле! Вы также можете использовать метод ExecuteScalar. Также я изменил ваш метод, чтобы использовать using, чтобы соединения закрывались правильно.

Предполагая, что ваша хранимая процедура возвращает одно десятичное значение.

public JsonResult GetSalesToday()
{
    var strQuery = "SP_DAILY_SALES";
    decimal total = 0.0M;

    var conStr = ConfigurationManager.ConnectionStrings["DefaultConnection"].ToString();

    using (var con = new SqlConnection(conStr)))
    {
        using (var cmd = new SqlCommand(strQuery, con))
        {
            con.Open();
            cmd.CommandType = CommandType.StoredProcedure;
            total = (decimal)cmd.ExecuteScalar();
        }
    }

    return Json(total, JsonRequestBehavior.AllowGet);
}

Кроме того, я вижу, что у вас есть неправильный код в вашем представлении. Вспомогательные методы TextBoxFor и LabelFor не принимают строку в качестве аргумента. Вам нужно использовать метод Html.TextBox и Html.Label

@Html.Label("DailySales", "Sales",new { @class = "col-xs-4 col-sm-offset-1 col-sm-4" })
@Html.TextBox("DailySales", new { @class = "form-control" })
person Shyju    schedule 11.08.2016
comment
Привет @Shyju, он возвращает ошибку в этой строке total + = Convert.ToInt32(row[DAILY_SALES]); 1-я ошибка: ; ожидаемый, который указывает на Convert и вторая ошибка: Недопустимый термин выражения '=', указывающий на этот = - person Kylie Irwin; 11.08.2016
comment
@KylieIrwin Прости! Дополнительное пространство! Исправлено сейчас. Этот код должен работать нормально. - person Shyju; 11.08.2016
comment
Ошибки сейчас пропали. Просто ошибка в том, как я это называю в этом @Html.LabelFor(DailySales, Sales) - person Kylie Irwin; 11.08.2016
comment
@KylieIrwin Я сделал еще одно обновление ответа, чтобы улучшить ваш метод сервера. - person Shyju; 11.08.2016
comment
Привет @Shyju! Я знаю, что это уже было помечено как ответ, но у меня возникла проблема с этим total = (decimal)cmd.ExecuteScalar(); ошибка Указанное приведение недопустимо. - person Kylie Irwin; 12.08.2016
comment
Привет @Shyju! Я знаю, что это уже было отмечено как ответ, но у меня возникла проблема с этим total = (decimal)cmd.ExecuteScalar(); Ошибка: указанное приведение недопустимо. - person Kylie Irwin; 12.08.2016
comment
Давайте продолжим обсуждение в чате. - person Kylie Irwin; 12.08.2016
comment
Как я упоминал в своем ответе ранее, код предполагает, что ваш SP возвращает одно десятичное значение. Если он возвращает целое число, используйте в своем коде переменную типа int вместо десятичной. - person Shyju; 12.08.2016
comment
что, если запрос возвращает нулевое значение? Например, что делать, если нет записей для возврата на эту дату? - person Kylie Irwin; 12.08.2016
comment
затем используйте decimal? (десятичное число с нулевым значением). И где бы вы ни отображали его значение, выполняйте нулевую проверку. - person Shyju; 12.08.2016
comment
получил это сейчас. Я изменил свою хранимую процедуру, чтобы она возвращала 0,00, если результат запроса равен нулю. Спасибо! :) - person Kylie Irwin; 12.08.2016

person    schedule
comment
@Кайли Ирвин, ты можешь попробовать это? - person ; 11.08.2016
comment
Я сделал. Он возвращает следующую ошибку: Ошибка 4 'int' не содержит определения для 'M', и не удалось найти метод расширения 'M', принимающий первый аргумент типа 'int' (вы пропустили директиву using или ссылка на сборку?) - person Kylie Irwin; 11.08.2016
comment
Теперь это работает отлично. Просто ошибка в том, как я это называю в этом @Html.LabelFor(DailySales, Sales) - person Kylie Irwin; 11.08.2016