【问题标题】:Passing Stored Procedure query result from JSonResult to Ajax将存储过程查询结果从 JSonResult 传递给 Ajax
【发布时间】:2016-08-11 14:07:09
【问题描述】:

美好的一天!我正在尝试将存储过程查询的结果显示到我页面上的文本框中。此存储过程仅返回一个结果,即每日销售额。我正在尝试通过JSonresult 执行此操作,以便可以将其传递给我的视图页面中的ajax。但我似乎无法成功通过它。

我有一个名为 ORDER 的表,其中包含 ORDER_DATENET_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>

我哪里错了?有人可以帮我解决这个问题吗?提前致谢!

【问题讨论】:

  • 您的 SP_DAILY_SALES sp 返回什么? DailySales 的价值是什么?
  • 函数DailySales(data);有什么作用?
  • @Shyju 它返回 SUM(NET_AMOUNT) 作为 DAILY_SALES,然后我将其传递给 lstSales。我创建了 var DailySales 并将 lstSales 分配给另一个变量 SALESTODAY 。 DailySales 是我认为传递给 ajax 的东西。

标签: sql-server asp.net-mvc asp.net-ajax jsonresult


【解决方案1】:

如果您想要总和,只需为此保留一个变量并返回即可。

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);
}

另外,我发现您的视图中有一些错误的代码。 TextBoxForLabelFor 辅助方法不将字符串作为参数。你需要使用Html.TextBoxHtml.Label方法

@Html.Label("DailySales", "Sales",new { @class = "col-xs-4 col-sm-offset-1 col-sm-4" })
@Html.TextBox("DailySales", new { @class = "form-control" })

【讨论】:

  • 嗨@Shyju 它在这一行返回一个错误 total + = Convert.ToInt32(row["DAILY_SALES"]); 第一个错误:;预期 指向 Convert 和第二个错误:Invalid expression term '=' 指向这个 =
  • @KylieIrwin 对不起!额外空间!现在修好了。这段代码应该可以正常工作。
  • 错误现在消失了。我在这个 @Html.LabelFor("DailySales", "Sales") 中如何称呼它只是一个错误
  • 然后使用decimal?(可以为空的十进制)。无论您在哪里显示它的值,都要进行空检查。
  • 现在知道了。我更改了我的存储过程,如果查询结果为空,它将返回 0.00。谢谢! :)
【解决方案2】:
`decimal total = 0.0;
foreach (DataRow row in dtTable.Rows)
{
   lstSales.Add(row["DAILY_SALES"].ToString());
   total = total + Convert.ToInt32(row["DAILY_SALES"]);
}
return Json(total,JsonRequestBehaviour.AllowGet);`

【讨论】:

  • @Kylie Irwin 你可以试试这个
  • 我做到了。它返回此错误:错误 4“int”不包含“M”的定义,并且找不到接受“int”类型的第一个参数的扩展方法“M”(您是否缺少 using 指令或程序集参考?)
  • 现在工作得很好。我在这个 @Html.LabelFor("DailySales", "Sales") 中如何称呼它只是一个错误
猜你喜欢
  • 1970-01-01
  • 2019-10-11
  • 1970-01-01
  • 2017-12-29
  • 1970-01-01
  • 2011-10-25
  • 2021-04-05
  • 1970-01-01
  • 2010-10-10
相关资源
最近更新 更多