ASP.NET学习社区
ksni56z - 2008-7-26 19:13:00
就比如 将产品的小计这一列 用程序求出他的所有小计加在一起的总价出来?
我看了网上可以在存储过程中计算出来:select * from bbs_border compute sum(counts)
但不知道该如何在类中怎么写 程序中该如何接受 能否告之一二
suresy - 2008-7-26 20:14:00
在select语句后面加compute会返回两个结果集,第一个是数据表,第二个就是求和值
例如存储过程是:
alter procedure CalcSum
as
select * from bbs_border compute sum(counts)
return
C#代码:
using System.Data;
using System.Data.SqlClient;
SqlConnection conn = new SqlConnection(ConnectionString);
SqlDataAdapter adapter = new SqlDataAdapter("CalcSum", conn);
adapter.SelectCommand.CommandType = CommandType.StoredProcedure;
DataSet dataset = new DataSet();
conn.Open();
adapter.Fill(dataset);
conn.Close();
if (dataset.Tables.Count == 2) //查询成功
{
...... // dataset.Tables[0]为查询的数据表,绑定到Repeater
int sum = (int)dataset.Tables[1].Rows[0]["sum"]; //从第2个结果集取出求和值
}
else
{
// 错误处理
}
ksni56z - 2008-7-26 20:17:00
如果用mvc 应该怎么写啊 除了dataset以外SqlDataReder能读的出来吗
suresy - 2008-7-26 20:30:00
mvc我就不清楚了......
因为涉及到多个结果集,所以SqlDataReader不适用于这种场合,好像就只有用DataSet了......
ksni56z - 2008-7-26 21:25:00
还是不行啊 老提示说:非静态的字段、方法或属性“System.Data.DataSet.Tables”要求对象引用
ksni56z - 2008-7-26 21:29:00
原帖由 ksni56z 于 2008-7-26 21:25:00 发表
还是不行啊 老提示说:非静态的字段、方法或属性“System.Data.DataSet.Tables”要求对象引用
这个好了 是我写的不一样 但是好像还是不行 又提示说什么
不支持 COMPUTE BY 语句。 说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。
异常详细信息: System.InvalidOperationException: 不支持 COMPUTE BY 语句。
源错误:
| 行 62: da.SelectCommand.CommandType=CommandType.StoredProcedure;行 63: DataSet ds=new DataSet();行 64: da.Fill(ds); |
suresy - 2008-7-27 0:25:00
我查了一下MSDN:
本文引用下面的 Microsoft .NET 框架类库名称空间:
• System.Data.OleDb
• System.Data.SqlClient
症状
当您尝试在 Microsoft SQL Server .NET 数据提供程序中使用 COMPUTE BY 子句时,收到以下异常消息:
未处理的“System.InvalidOperationException”类型的异常出现在 system.data.dll 中。
其他信息:不支持 COMPUTE BY 语句。
注意:SQL Server 语句中的 COMPUTE BY 子句在结果集中生成分类汇总。
原因
此现象是由于 SQL Server .NET 数据提供程序的限制而导致的。
并非所有的 SQL 语法语句都受 SQL Server .NET 数据提供程序支持。
解决方案
要解决此问题,请通过 COM Interop 使用 ADO,或者使用 OLE DB .NET 数据提供程序。
状态
这种现象是设计导致的。
aspx1 - 2008-7-27 7:57:00
学习了,谢谢
zorosuteng - 2008-7-28 10:46:00
在数据库端处理最好了,在数据库端把小计的值都计算出来,小计行就当是表的最后一行,在程序端直接读出就行了。我怎么看你们处理的很复杂啊
suresy - 2008-7-29 9:28:00
LS的方法不错,就是有个问题,对于自动编号的表,每次插入新数据后怎么保证小计行还是表的最后一行?感觉先删除再插入新数据再重新插入小计行这种做法效率不太高
zorosuteng - 2008-7-29 11:25:00
sql server数据库我不是很明白,Oracle的话在包中建立2个过程或函数,一个是处理增加、修改、删除数据的,另一个是是在前一个过程后在更新后的表中增加小计行,然后返回到程序端的数据集中或别的数据容器中,当然这个增加小计行方法也可以在一个程序类里面实现,在把数据库表加载到内存表中后就可以在这个表中增加小计行了,位置自然就在最后一行了,然后将增加了小计行的表做为数据源 绑定就行了
suresy - 2008-7-29 12:52:00
我又想了一下,插入新数据时好像可以不用删除小计行,直接修改那条记录就行了,然后再插入重新计算的小计行,这种方法不错啊。
Sql Server实现起来应该也差不多,就是增加一个存储过程专门处理插入新数据时的计算和处理小计行。读取记录后在程序中处理效率就比较低了,简单的任务尽量都交给数据库去处理比较好。
zorosuteng - 2008-7-29 13:08:00
在数据库端实现比在程序端加上页脚,在页脚中计算显示出合计值快多了,而且设计了分页后导出时也能从数据库把合计值也导出去。
ksni56z - 2008-7-29 13:30:00
LS的都说的太笼统了 能不能详细写一下啊
zorosuteng - 2008-7-29 14:07:00
写了一个程序实现的方法:
/// <summary>
/// 获取含统计合计值的数据视图
/// </summary>
/// <param name="SeleView">需变化的视图</param>
/// <param name="indexCol">起始列</param>
/// <param name="lastCol">截至列</param>
/// <returns>返回含统计行的视图</returns>
public DataView getsumView(DataView SeleView, int indexCol, int lastCol)
{
if (SeleView.Count > 0)
{
decimal[] sumCol = new decimal[SeleView.Table.Columns.Count];
string itemText = "";
DataRow NewRow = SeleView.Table.NewRow();
for (int i = indexCol; i <= lastCol; i++)
{
sumCol = new decimal();
itemText = SeleView.Table.Columns.ColumnName;
for (int j = 0; j < SeleView.Count; j++)
{
sumCol += decimal.Parse(SeleView[j][itemText].ToString());
}
NewRow[itemText] = sumCol.ToString();
}
SeleView.Table.Rows.Add(NewRow);
}
return SeleView;
}
数据库端实现,我们公司的Oracle 管理员设置了权限还有监控我就不给你具体写了,但是数据库端更简单更快,效果更好。
zorosuteng - 2008-7-29 14:14:00
写个简单的语句给你参考吧!
select 字段(1),。。。 from 表
union all
select '合计:',sum(rs),sum(xb1),sum(xb2),sum(xb3) from 表 group 。。。
ksni56z - 2008-7-30 16:37:00
先试试 谢谢ls的朋友了
1