【问题标题】:How to Retrieve value of SUM function in SQL through c#如何通过c#在SQL中检索SUM函数的值
【发布时间】:2015-06-15 20:43:27
【问题描述】:

我有一个存储过程 CalculateTotal 从表支出返回金额列中所有记录的总和

`CREATE PROCEDURE CalculateTotal
 @Name varchar(50),
 @Month int
 @year
 As
 SELECT SUM(Amount) As Total
 FROM Spendings
 WHERE MONTH(Date) = @Month AND YEAR(Date)= @Year AND Name = @Name`

当我从 SQLServer 执行此过程时,执行成功并返回总金额,
我需要从 C# 中获取 Total 的值,我尝试了以下代码,

public void CalculateTotal(string name, int month , int year)
 {
     cmd = connection.CreateCommand();
     cmd.CommandText = "EXECUTE CalculateTotal @Name,@Month,@Year";
     cmd.Parameters.AddWithValue("@Name", name);
     cmd.Parameters.AddWithValue("@Month", month);
     cmd.Parameters.AddWithValue("@Year", year);
     reader = cmd.ExecuteReader();          
     if(reader.HasRows)
     {
           while (reader.Read())
           {
               int total = (int)reader["Total"];
           }
      }
}

当我调试它时,'While' 条件为真,当'while' 循环体执行时遇到称为 IndexOutOfRangeException 的错误:Total

如何在 c# 中检索 SUM 函数的值

【问题讨论】:

  • 您使用存储过程而不是函数是否有特定原因?如果只需要求和,函数可能更容易编写和调用
  • @Bala 你试过我的答案了吗?
  • 哎呀,很抱歉回复晚了@ofcoursedude。仅出于一个原因,我使用存储过程,即使我在另一个系统中运行 dll,我也可以轻松修改查询。
  • @iJay 感谢您的回答。我试过了,但是在调试时returnParameter返回0,但要返回的实际值为100。
  • @Bala 它对我来说很好用,如果您有兴趣,请再次检查。我做了一些小改动

标签: c# mysql sql-server stored-procedures


【解决方案1】:

当通过 ADO 从 SQL Server 返回单个值时,我建议您使用 ExecuteScalar。使用示例:

    Int32 total= (Int32)cmd.ExecuteScalar();

还请查看实现 using 模式以确保不会导致内存泄漏。

【讨论】:

  • 感谢您的信息。当我将转换方法更改为“ Int32 total = Convert.ToInt32(cmd.ExecuteScalar()); ”时,这对我有用。
【解决方案2】:

可以试试这样的。

public void CalculateTotal(string name, int month , int year)
 {
     cmd = connection.CreateCommand();
     cmd.CommandText = "CalculateTotal";
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Parameters.AddWithValue("@Name", name);
     cmd.Parameters.AddWithValue("@Month", month);
     cmd.Parameters.AddWithValue("@Year", year);
     connection.Open();
     string result = cmd.ExecuteScalar().ToString();
     connection.Close();
}

【讨论】:

  • 得到了结果,这个成功了,我需要返回整数,所以我只需输入 cast it。
【解决方案3】:

改变你的程序;

 CREATE PROCEDURE CalculateTotal
 @Name varchar(50),
 @Month int
 @year int
 @Total int Output
 As
 BEGIN
 SELECT @Total = SUM(Amount)
 FROM Spendings
 WHERE MONTH(Date) = @Month AND YEAR(Date)= @Year AND Name = @Name
 END

您需要在命令中添加返回参数:

public void CalculateTotal(string name, int month , int year)
 {
     cmd = connection.CreateCommand();
     cmd.CommandText = "CalculateTotal";
     cmd.CommandType = CommandType.StoredProcedure;
     cmd.Parameters.AddWithValue("@Name", name);
     cmd.Parameters.AddWithValue("@Month", month);
     cmd.Parameters.AddWithValue("@Year", year);
     var returnParameter = cmd.Parameters.Add("@Total", SqlDbType.Int);
     returnParameter.Direction = ParameterDirection.ReturnValue;
     int total = (Int32)cmd.ExecuteScalar(); 
}

【讨论】:

  • 非常感谢 iJay,它的工作原理,但它为“total = (Int32)cmd.ExecuteScalar()”返回 0。我尝试使用“total = Convert.ToInt32(cmd.ExecuteScalar())”现在它返回正确的值。 :-)
【解决方案4】:

我尝试了以下示例的代码:

SqlCommand cmd2 = new SqlCommand();
cmd2 = con.CreateCommand();
cmd2.CommandText = "gettotalprice";
cmd2.CommandType = CommandType.StoredProcedure;
cmd2.Parameters.AddWithValue("@ordernums", ordnum.Text);
string result = cmd2.ExecuteScalar().ToString();
Label2.Text = "<b>Total Amount= </b>" + result + " Rs.";

对我来说一切都很好,没有任何问题,我得到了总金额。

【讨论】:

    猜你喜欢
    • 2019-09-01
    • 1970-01-01
    • 2020-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多