【问题标题】:Stored Procedures Basic Help Getting Totals Back From table存储过程基本帮助 从表中获取总计
【发布时间】:2016-02-29 23:01:34
【问题描述】:

这是我的存储过程,查询返回一个包含三列的表,每列的总金额。

单价、税金、订单总额

ALTER PROCEDURE [dbo].[sp_TaxOrderReport]
    -- Add the parameters for the stored procedure here
    @StartDate date,
    @EndDate date,
    @TaxReturnValue int,
    @TotalReturnValue int,
    @UnitReturnValue int
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here
    SELECT Sum(oi.UnitPrice) as UnitPrice, Sum(oi.Tax) as Tax,
        Sum(oi.TotalAmount) as OrderTotal
     FROM OrderItems oi, Orders o
     where @StartDate <= o.OrderDate and O.OrderDate <= @EndDate 
        and o.OrderId = oi.OrderId

    select @TaxReturnValue as Tax
    select @UnitReturnValue as UnitPrice
    select @TotalReturnValue as OrderTotal

    -- How can I return several values over?? 
    return @TaxReturnValue

END

我的目标是让管理员输入日期并获得总销售税和税前收入的报告。这就是我的方法在我的控制器中的样子。

public ActionResult GetTaxReport(string StartDate, string EndDate)
{
    string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Open();
        using (SqlCommand cmd = new SqlCommand("sp_TaxOrderReport", connection))
        {
            cmd.CommandType = CommandType.StoredProcedure;
            cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = StartDate;
            cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = EndDate;
            cmd.Parameters.Add("@TaxReturnValue", SqlDbType.Int).Value = 0;
            cmd.Parameters.Add("@UnitReturnValue", SqlDbType.Int).Value = 0;
            cmd.Parameters.Add("@TotalReturnValue", SqlDbType.Int).Value = 0;

            cmd.ExecuteNonQuery();
            var returnvalue = cmd.Parameters["@TaxReturnValue"].Value.ToString();
        }
        connection.Close();
    }
    return View("FindUser");
}

@TaxReturnValue 没有设置为列中的值,我似乎无法找到一种方法来设置所有这三个变量,然后将它们全部返回,以便我可以在我的视图中呈现它们。如果有人有任何提示,我将不胜感激。

-----UPDATE--------------

我想我会更新问题以包含答案,以防万一有人需要关于如何返回和设置传递给存储过程的变量的非常明确的答案。

存储过程:

ALTER PROCEDURE [dbo].[sp_TaxOrderReport]
    -- Add the parameters for the stored procedure here
    @StartDate date,
    @EndDate date,
    @TaxReturnValue int OUTPUT,
    @TotalRevenue int OUTPUT,
    @UnitReturnValue int OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    --Insert statements for procedure here
    SELECT
        @TaxReturnValue = Sum(oi.Tax), 
        @UnitReturnValue = Sum(oi.UnitPrice),
        @TotalRevenue = Sum(oi.TotalAmount)
     FROM OrderItems oi, Orders o
     where @StartDate <= o.OrderDate and O.OrderDate <= @EndDate 
        and o.OrderId = oi.OrderId

END

C#代码:

        string connectionString = ConfigurationManager.ConnectionStrings["DefaultConnection"].ConnectionString;

        using (var connection = new SqlConnection(connectionString))
        {
            connection.Open();
            using (SqlCommand cmd = new SqlCommand("sp_TaxOrderReport", connection))
            {
                cmd.CommandType = CommandType.StoredProcedure;
                cmd.Parameters.Add("@StartDate", SqlDbType.DateTime).Value = StartDate;
                cmd.Parameters.Add("@EndDate", SqlDbType.DateTime).Value = EndDate;
                cmd.Parameters.Add("@TaxReturnValue", SqlDbType.Int).Value = 0;
                cmd.Parameters.Add("@UnitReturnValue", SqlDbType.Int).Value = 0;
                cmd.Parameters.Add("@TotalRevenue", SqlDbType.Int).Value = 0;


                cmd.Parameters["@TaxReturnValue"].Direction = ParameterDirection.Output;
                cmd.Parameters["@TotalRevenue"].Direction = ParameterDirection.Output;
                cmd.Parameters["@UnitReturnValue"].Direction = ParameterDirection.Output;

                cmd.ExecuteNonQuery();

                var taxTotal = cmd.Parameters["@TaxReturnValue"].Value;
                var unitPriceTotal = cmd.Parameters["@UnitReturnValue"].Value;
                var totalRenuve = cmd.Parameters["@TotalRevenue"].Value;

            }
            connection.Close();
        }

感谢大家的帮助!

【问题讨论】:

    标签: c# mysql sql-server


    【解决方案1】:

    对于初学者,您需要设置ParameterDirection 否则@TaxReturnValue 不会返回:

    cmd.Parameters.Add("@TotalReturnValue", SqlDbType.Int).Value = 0;
    
    cmd.Parameters["@TaxReturnValue"].Direction = ParameterDirection.ReturnValue;
    

    但是,这仍然不会返回您的值,因为您没有正确填充它们。你应该这样做:

    SELECT @TaxReturnValue = Sum(oi.UnitPrice) as UnitPrice, 
        @UnitReturnValue=Sum(oi.Tax),
        TotalReturnValue =Sum(oi.TotalAmount) as OrderTotal
     FROM OrderItems oi, Orders o
     where @StartDate <= o.OrderDate and O.OrderDate <= @EndDate 
        and o.OrderId = oi.OrderId
    
    --select @TaxReturnValue as Tax
    --select @UnitReturnValue as UnitPrice
    --select @TotalReturnValue as OrderTotal
    

    然后您应该将这些变量指定为OUTPUT 参数:

    ALTER PROCEDURE [dbo].[sp_TaxOrderReport]
        -- Add the parameters for the stored procedure here
        @StartDate date,
        @EndDate date,
        @TaxReturnValue int OUTPUT,
        @TotalReturnValue int OUTPUT,
        @UnitReturnValue int OUTPUT
    AS
    

    你需要在 C# 中使用类似的东西:

    cmd.Parameters["@TaxReturnValue"].Direction = ParameterDirection.Output;
    cmd.Parameters["@TotalReturnValue "].Direction = ParameterDirection.Output;
    cmd.Parameters["@UnitReturnValue "].Direction = ParameterDirection.Output;
    

    或者,您可以使用 select 语句(不使用变量)返回结果集,有关详细信息,请参阅documentation

    【讨论】:

    • 嘿朋友,我尝试添加它,但它仍然返回 0。有没有一种方法可以将整个 3 列表作为对象操作并从那里获取值?变量未在存储过程中设置。
    • 感谢人更新了问题以包含更正的编辑代码。非常感谢您的回答。
    【解决方案2】:

    您应该在过程中要返回的参数上指定输出变量

    ...
    @EndDate date,
    @TaxReturnValue int output,
    @TotalReturnValue int,
    ...
    

    你也可以查看post

    【讨论】:

      猜你喜欢
      • 2018-08-05
      • 2013-06-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-01-01
      相关资源
      最近更新 更多