首页 > 开发 > 综合 > 正文

实例讲解System.Data.DataTable计算功能

2024-07-21 02:43:46
字体:
来源:转载
供稿:网友
本文根据一个实例着重介绍了System.Data.DataTable的计算功能,相信这篇文章定能为大家的工作和学习有所帮助。

using System;using System.ComponentModel;using System.Data;using System.Windows.Forms;namespace Windowsapplication1...{public partial class Form1 : Form...{public Form1()...{InitializeComponent();}PRivate void button1_Click(object sender, EventArgs e)...{//System.Data.DataTable计算功能详解,转载请保留以下信息//测试环境      vs2005,c#           System.Data.DataTable table = new DataTable();//计算常量,可以没有初始化列object test = table.Compute("1+1", "");Console.WriteLine(test);//test=2;test = table.Compute("1+1", "false");Console.WriteLine(test);//test=2;常数计算和filter无关test = table.Compute("abs(1)", "");Console.WriteLine(test);//test=null,不知道为这个什么没有抱错,而且返回null,其他的数学函数都会抱错test = table.Compute("2%2", "");Console.WriteLine(test);//test=0;//其他函数参考下面的计算列//初始化datataletable.Columns.Add("id", typeof(string));table.Columns.Add("value", typeof(int));for (int i = 1; i <= 10; i++)...{System.Data.DataRow dRow = table.NewRow();dRow["id"] = "id"+i.ToString();dRow["value"] = i;table.Rows.Add(dRow);}//test = table.Compute("value+1", "true");/**/////抛出异常,这里必须是聚合函数//****************支持的聚合函数*****************//            //求数量test = table.Compute("count(id)", "false");Console.WriteLine(test); //test=0;test = table.Compute("count(id)", "true");Console.WriteLine(test); //test=10;//求和test = table.Compute("sum(value)", "");Console.WriteLine(test);//test=55;//test = table.Compute("sum(id)","");/**/////抛出异常,这里不能是string//平均test = table.Compute("avg(value)", "");Console.WriteLine(test);//test=5;//最小test = table.Compute("min(value)", "");Console.WriteLine(test);//test=1;//最大test = table.Compute("max(value)", "");Console.WriteLine(test);//test=10;//统计标准偏差test = table.Compute("StDev(value)", "");Console.WriteLine(test);//test=3.02765035409749//统计方差test = table.Compute("Var(value)", "");Console.WriteLine(test);//test=9.16666666666667//复杂计算test = table.Compute("max(value)/sum(value)", "");Console.WriteLine(test);//test=0.181818181818182 /**//*******************计算列******************/System.Data.DataColumn column = new DataColumn("exp1",typeof(float));table.Columns.Add(column);//简单计算column.Expression = "value*2";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2;//字符串函数column.Expression = "len(id)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=3;//字符串函数column.Expression = "len(' '+id+' ')";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=5;//字符串函数column.Expression = "len(trim(' '+id+' '))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=3;//字符串函数column.Expression = "substring(id,3,len(id)-2)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1; //substring的起始字符位置为1不是0//类型转换column.Expression = "convert(substring(id,3,len(id)-2),'System.Int32')*1.6";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1.6;//相当于sqlserver的isnullcolumn.Expression = "isnull(value,10)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1;//三元运算符,相当于sqlserver的case whencolumn.Expression = "iif(value>5,1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2000;//like运算符column.Expression = "iif(id like '%1',1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=1000;//in运算符column.Expression = "iif(id not in('id1'),1000,2000)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=2000;//嵌套的三元运算column.Expression = "iif(value>5,1000,iif(id like '%1',4000,2000))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=4000;//客户端计算所占总数的百分比column.Expression = "value/sum(value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=0.01818182 //客户端计算差值,比如nba常规赛的胜场差column.Expression = "max(value)-value";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=9//**********************父子表计算************************///初始化子表,父子表关系DataTable tableChild = new DataTable();            tableChild.Columns.Add("id", typeof(string));tableChild.Columns.Add("value", typeof(int));System.Data.DataSet ds = new DataSet();ds.Tables.Add(tableChild);ds.Tables.Add(table);DataRelation relation = new DataRelation("relation", table.Columns["id"], tableChild.Columns["id"]);ds.Relations.Add(relation);for (int i = 1; i <= 10; i++)...{System.Data.DataRow dRow = tableChild.NewRow();dRow["id"] = "id1";dRow["value"] = i;tableChild.Rows.Add(dRow);}//计算子表记录数column.Expression = "count(child(relation).value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=10;            //计算父子表的百分比column.Expression = "value/sum(child(relation).value)";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=0.01818182;//计算父子表的差值,比如父表为库存数量,子表为订购数量,计算得出需要补充的数量column.Expression = "iif(value-sum(child(relation).value)>0,0,value-sum(child(relation).value))";test = table.Select("id='id1'")[0]["exp1"];Console.WriteLine(test);//test=-54;//遗憾的是没有发现能够计算同比和环比的方法,而且计算列无法作为约束//************结束,DataTable可以让你尽量发挥聪明才智来减少繁杂的sql语句并且减轻服务器计算符合。                              }}}

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表