【问题标题】:How to access values returned by a Stored Procedure in Code Behind如何在代码隐藏中访问存储过程返回的值
【发布时间】:2018-09-28 06:23:41
【问题描述】:

我是存储过程的初学者。我想获得 2 列的总和并将其显示在 HTML 中的不同标签中。我想知道我的代码问题的主要根源是什么。

C# 调试器说“确保该列存在于表中”。

存储过程:

CREATE PROCEDURE [dbo].[spTotalOverTime]
    @tsdate DATE = '2018/1/1'
AS
BEGIN
    SELECT SUM(Overtime), SUM(PlanOt)
    FROM tblTimesheet           
    WHERE YEAR(tsDate) =  YEAR(@tsDate)  AND MONTH(tsDate) = MONTH(@tsdate)
END

HTML:

<div class="row cells12">
    <div class="cell colspan4 offset1">
        <h6 class="mif-hour-glass"> Total Planned Overtime:</h6>
        <div>
            <label id="lblPlan"></label>
        </div>
        <br />
    </div>
    <div class="cell colspan4 offset1">
        <h6 class="mif-alarm"> Total Actual Overtime:</h6>
        <div>
            <label id="lblActual"></label>
        </div>
    </div>
</div>

C#

[WebMethod]
public string LoadOT(DateTime date)
{
    List<OTTotal> mylist = new List<OTTotal>();
    using (SqlConnection connection = new SqlConnection(connectionString()))
    {
        connection.Open();
        SqlCommand cmd = new SqlCommand("spTotalOverTime", connection);
        cmd.Parameters.Add("@tsdate", SqlDbType.Date).Value = date;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandTimeout = 0;

        SqlDataReader dr = cmd.ExecuteReader();
        while (dr.Read())
        {
            mylist.Add(new OTTotal
            {
                 OTAct = Convert.ToDouble(dr["Overtime"].ToString()),
                 OTPlan = Convert.ToDouble(dr["PlanOt"].ToString())
            });
        }
        dr.Close();
        connection.Close();
    }
    JavaScriptSerializer jss = new JavaScriptSerializer();
    string jsn = jss.Serialize(mylist);
    return jsn;
}

JavaScript

function getOTVal(year, month) {
    var asd = "{'date':'" + year + "/" + month + "/1" + "'}";
    $.ajax({
        type: 'POST',
        url: '../WebService/wsSummary.asmx/LoadOT',
        dataType: 'json',
        data: asd,
        contentType: 'application/json; charset=utf-8',
        success: function (response) {
            var cells = eval("(" + response.d + ")");
            for (var i = 0; i < cells.length; i++) {
                $('#lblActual').text(cells[i].OTAct);
                $('#lblPlan').text(cells[i].OTPlan);
            }
        },
        error: function (error) {
            alert(JSON.stringify(error))
            console.log(error);
        }
    });
}

【问题讨论】:

  • 现在的行为是什么(如果您有错误是什么错误?)以及您期望的正确行为是什么?
  • 似乎您在存储过程中缺少“分组依据”..
  • @AlexandruPopa - 当我运行系统时,C# 调试器说确保该列存在于表中
  • 当我们使用SUM@ShijuShaji时,我们真的需要group by
  • @Alexis 那么为什么您的问题中没有关键信息(最好是CREATE TABLE,以便我们重现问题)?

标签: javascript c# html sql-server


【解决方案1】:

问题是您的存储过程不返回名为 Overtime 和 PlanOt 的列。当您在列上应用函数时,结果列是未命名的,因此您应该给它一个别名,如下所示:

CREATE PROCEDURE [dbo].[spTotalOverTime]
    @tsdate DATE = '2018/1/1'
AS
BEGIN
    SELECT SUM(Overtime) AS Overtime, SUM(PlanOt) AS PlanOt
    FROM tblTimesheet         
    WHERE YEAR(tsDate) = YEAR(@tsDate) AND MONTH(tsDate) = MONTH(@tsdate)
END

【讨论】:

  • 好的,我试着给它一个“别名”先生。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-04-07
  • 1970-01-01
  • 1970-01-01
  • 2011-08-23
  • 2010-10-23
  • 2010-11-01
  • 1970-01-01
相关资源
最近更新 更多