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

Posted

技术标签:

【中文标题】如何通过c#在SQL中检索SUM函数的值【英文标题】:How to Retrieve value of SUM function in SQL through c# 【发布时间】: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 它对我来说很好用,如果您有兴趣,请再次检查。我做了一些小改动 【参考方案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.";

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

【讨论】:

以上是关于如何通过c#在SQL中检索SUM函数的值的主要内容,如果未能解决你的问题,请参考以下文章

我的 SQL 函数有啥问题,当我尝试在 C# 中检索它的值时它总是返回 null?

asp.net如何对DataTable 或DataView进行统计,比如像用SQL函数里的Sum统计类似。

如何让SQL语句中的聚集函数sum不忽略NULL值

Oracle Sql 查询:如何在包中旋转函数 Sum()?

oracle 中 sum 如何使用,

如何减去而不是添加像 sql 函数一样的 Sum() [关闭]