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語句并且減輕服務器計算符合。 }}} |