如何通过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统计类似。