c# 分组求和功能

本人新手, 代码没有显示错误,不过每次运行都只返回第一个数据。 这个功能的作用是把数据库中用餐单号相同的计费单价乘以对应的计费数量,再把他们的和加起来返回到textBox中,研究好几天,要不然就是有错误,要不然就出不来结果,求大神帮帮忙,跪谢跪谢。
...全文
401 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
wid999 2019-05-12
  • 打赏
  • 举报
回复
引用 1 楼 stherix 的回复:
你不会写的其实是sql语句

select sum(计费单价*计费数量) as 总价 from 用餐明细 where 用餐单号=xxxx

SDR["总价"].ToString()


看得很细致^_^
  • 打赏
  • 举报
回复
引用 21 楼 行走的小强的回复:
程序加断点,看看你查询数据库返回的值是否正确,否则就是数据库语句有错误
谢谢谢谢谢谢谢谢谢谢谢【鞠躬】
  • 打赏
  • 举报
回复
引用 22 楼 把分全给哥的回复:
SqlServer 根据字段分类汇总信息
谢谢谢谢谢谢谢谢谢谢谢【鞠躬】
  • 打赏
  • 举报
回复
引用 16 楼 jx315425246的回复:
调试一下,在textBox5.text = a1.ToString();那设断点,看a1的值,一定是其他地方修改了textBox5的值
这几天把这个系统重新做了一下,发现代码没问题,又和之前那个进行了比较,结果是那个控件有问题。。。。我把后台代码都删了,那个控件还是会显示数据库第一条信息,真是。。。。吓坏我了。另外,万分感谢大佬的耐心回复,谢谢【鞠躬】
秋的红果实 2019-04-25
  • 打赏
  • 举报
回复
上面各位说的很清楚了,sum,返回只有一条! 你要出现多条,那估计是需要group

SELECT 单价,SUM(单价*数量) as 总和 FROM 用餐明细 GROUP BY 单价 WHERE 用餐单号=................
jx315425246 2019-04-25
  • 打赏
  • 举报
回复
调试一下,在textBox5.text = a1.ToString();那设断点,看a1的值,一定是其他地方修改了textBox5的值
jx315425246 2019-04-25
  • 打赏
  • 举报
回复
引用 19 楼 ぃ 疏影横斜ˇ水清浅 づ™ 的回复:
[quote=引用 16 楼 jx315425246的回复:]调试一下,在textBox5.text = a1.ToString();那设断点,看a1的值,一定是其他地方修改了textBox5的值

还有一个问题,就是用餐单号要用textBox4里的单号,代码里却没有引用过,会不会出现问题[/quote]

不是引用了吗 where 用餐单号=“+textbox4.text
行走的小强 2019-04-25
  • 打赏
  • 举报
回复
程序加断点,看看你查询数据库返回的值是否正确,否则就是数据库语句有错误
  • 打赏
  • 举报
回复
引用 17 楼 秋的红果实的回复:
上面各位说的很清楚了,sum,返回只有一条! 你要出现多条,那估计是需要group

SELECT 单价,SUM(单价*数量) as 总和 FROM 用餐明细 GROUP BY 单价 WHERE 用餐单号=................
用这个功能的话,是不是不能在textBox4中指定用餐单号?我之前试过,好像也是只显示第一行的数据
  • 打赏
  • 举报
回复
引用 16 楼 jx315425246的回复:
调试一下,在textBox5.text = a1.ToString();那设断点,看a1的值,一定是其他地方修改了textBox5的值
还有一个问题,就是用餐单号要用textBox4里的单号,代码里却没有引用过,会不会出现问题
  • 打赏
  • 举报
回复
定义了i,下文却没有出现过,是不是那这个i是多余的吗
  • 打赏
  • 举报
回复
引用 13 楼 jx315425246的回复:
不可能的

[quote=引用 11 楼 ぃ 疏影横斜ˇ水清浅 づ™ 的回复:]
[quote=引用 9 楼 jx315425246的回复:]sql语句改成(SELECT 计费单价,计费数量 FROM .....)

int i;
decimal a1;
a1 = 0;
while (SDR.Read())
{
a1 += decimal.Parse(SDR["计费单价"].ToString()) * int.Parse(SDR["计费数量"].ToString());
}
SDR.Close();
textBox5.text = a1.ToString();

改过之后,和之前一样,出来的还是第一行的˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚[/quote]

不可能的,你可以跟踪一下[/quote] 我运行了,仍然显示第一行,我把第一行改了,显示改后的第一行。 这个与我的表名是中文有关系吗
  • 打赏
  • 举报
回复
我运行了,仍然显示第一行,我把第一行改了,显示改后的第一行。 这个与我的表名是中文有关系吗
  • 打赏
  • 举报
回复
引用 8 楼 HerryDong的回复:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static string dbConnectionString = "******************************"; // 你的数据库连接字符串

static void Main(string[] args)
{
// 获取数据表
string sql = "select * from 用餐明细 where 用餐单号=@用餐单号";
DataTable dataTable = ExecuteQuery(sql, new SqlParameter("@用餐单号", "A0002"));

// 计算总价格
double price = 0.0;
foreach (DataRow row in dataTable.Rows)
{
price += Convert.ToDouble(row["计费单价"].ToString()) * Convert.ToDouble(row["计费数量"].ToString());
}

// 打印输出
Console.WriteLine(price);
}

static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
{
DataTable dataTable = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, dbConnectionString))
{
if (parameters != null && parameters.Length > 0)
{
adapter.SelectCommand.Parameters.AddRange(parameters);
}
adapter.Fill(dataTable);
}
return dataTable;
}
}
}

楼主的代码有几个问题。第一个是数据表的好像没有主码,自动编号那一列有重复值。第二个问题是SQL的写法有问题,实际项目中尽量避免使用字符串拼接的方式生成SQL,要么参数化的SQL,要么直接用存储过程~第三个是连接字符串最好写在配置文件里,避免到时候连接字符串变了需要改N多个文件~
自动编号和用餐单号相对应,没有重复值。另外数据库里确实没有主键,不太确定要怎么用,还有用餐明细这个表,要不要与用餐信息这个表相连,用餐信息里只有用餐单号,入座台位,自动编号这些基本信息,界面里输入的用餐单号就是从这里连过去的。
  • 打赏
  • 举报
回复
引用 9 楼 jx315425246的回复:
sql语句改成(SELECT 计费单价,计费数量 FROM .....)

int i;
decimal a1;
a1 = 0;
while (SDR.Read())
{
a1 += decimal.Parse(SDR["计费单价"].ToString()) * int.Parse(SDR["计费数量"].ToString());
}
SDR.Close();
textBox5.text = a1.ToString();
改过之后,和之前一样,出来的还是第一行的˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚
  • 打赏
  • 举报
回复
引用 8 楼 HerryDong的回复:

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static string dbConnectionString = "******************************"; // 你的数据库连接字符串

static void Main(string[] args)
{
// 获取数据表
string sql = "select * from 用餐明细 where 用餐单号=@用餐单号";
DataTable dataTable = ExecuteQuery(sql, new SqlParameter("@用餐单号", "A0002"));

// 计算总价格
double price = 0.0;
foreach (DataRow row in dataTable.Rows)
{
price += Convert.ToDouble(row["计费单价"].ToString()) * Convert.ToDouble(row["计费数量"].ToString());
}

// 打印输出
Console.WriteLine(price);
}

static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
{
DataTable dataTable = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, dbConnectionString))
{
if (parameters != null && parameters.Length > 0)
{
adapter.SelectCommand.Parameters.AddRange(parameters);
}
adapter.Fill(dataTable);
}
return dataTable;
}
}
}

楼主的代码有几个问题。第一个是数据表的好像没有主码,自动编号那一列有重复值。第二个问题是SQL的写法有问题,实际项目中尽量避免使用字符串拼接的方式生成SQL,要么参数化的SQL,要么直接用存储过程~第三个是连接字符串最好写在配置文件里,避免到时候连接字符串变了需要改N多个文件~
谢谢大佬,不过用餐单号是从界面里手动输入的,然后才会跳转到用餐明细,进行分组求和
jx315425246 2019-04-23
  • 打赏
  • 举报
回复
不可能的

引用 11 楼 ぃ 疏影横斜ˇ水清浅 づ™ 的回复:
[quote=引用 9 楼 jx315425246的回复:]sql语句改成(SELECT 计费单价,计费数量 FROM .....)

int i;
decimal a1;
a1 = 0;
while (SDR.Read())
{
a1 += decimal.Parse(SDR["计费单价"].ToString()) * int.Parse(SDR["计费数量"].ToString());
}
SDR.Close();
textBox5.text = a1.ToString();

改过之后,和之前一样,出来的还是第一行的˚‧º·(˚ ˃̣̣̥᷄⌓˂̣̣̥᷅ )‧º·˚[/quote]

不可能的,你可以跟踪一下
jx315425246 2019-04-20
  • 打赏
  • 举报
回复
sql语句改成(SELECT 计费单价,计费数量 FROM .....)

int i;
decimal a1;
a1 = 0;
while (SDR.Read())
{
a1 += decimal.Parse(SDR["计费单价"].ToString()) * int.Parse(SDR["计费数量"].ToString());
}
SDR.Close();
textBox5.text = a1.ToString();
HerryDong 2019-04-20
  • 打赏
  • 举报
回复

using System;
using System.Collections.Generic;
using System.Data;
using System.Data.SqlClient;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ConsoleApp1
{
class Program
{
static string dbConnectionString = "******************************"; // 你的数据库连接字符串

static void Main(string[] args)
{
// 获取数据表
string sql = "select * from 用餐明细 where 用餐单号=@用餐单号";
DataTable dataTable = ExecuteQuery(sql, new SqlParameter("@用餐单号", "A0002"));

// 计算总价格
double price = 0.0;
foreach (DataRow row in dataTable.Rows)
{
price += Convert.ToDouble(row["计费单价"].ToString()) * Convert.ToDouble(row["计费数量"].ToString());
}

// 打印输出
Console.WriteLine(price);
}

static DataTable ExecuteQuery(string sql, params SqlParameter[] parameters)
{
DataTable dataTable = new DataTable();
using (SqlDataAdapter adapter = new SqlDataAdapter(sql, dbConnectionString))
{
if (parameters != null && parameters.Length > 0)
{
adapter.SelectCommand.Parameters.AddRange(parameters);
}
adapter.Fill(dataTable);
}
return dataTable;
}
}
}

楼主的代码有几个问题。第一个是数据表的好像没有主码,自动编号那一列有重复值。第二个问题是SQL的写法有问题,实际项目中尽量避免使用字符串拼接的方式生成SQL,要么参数化的SQL,要么直接用存储过程~第三个是连接字符串最好写在配置文件里,避免到时候连接字符串变了需要改N多个文件~
加载更多回复(7)

110,499

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧