2016-02-29 73 views
1

这是我的存储过程,该查询返回三列一个表,每列内的总量。存储过程Basic帮助获得总计返回从表

单价,税务的OrderTotal

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

感谢所有帮助家伙!

回答

2

首先,你需要设置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

嘿朋友我尝试添加这不过它仍然返回0是否有我可以控制整个3列的表格作为一个对象,并从那里得到的值的方法吗?存储过程中的变量未被设置。 – Lostaunaum

+0

更新答案正确返回变量 – Jaco

+0

感谢的人更新为包含纠正编辑的代码的问题。非常感谢答复。 – Lostaunaum

0

你应该要在程序返回的参数指定输出变量

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

您可以检查此post