程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> 關於.NET >> System.Data.DataTable計算功能詳解

System.Data.DataTable計算功能詳解

編輯:關於.NET
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#
      //作者:     jinjazz
      //作者blog:   http://blog.csdn.net/jinjazz/
      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;
      //其他函數參考下面的計算列
  
      //初始化datatale
      table.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的isnull
      column.Expression = "isnull(value,10)";
      test = table.Select("id='id1'")[0]["exp1"];
      Console.WriteLine(test);
      //test=1;
      //三元運算符,相當於sqlserver的case when
      column.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語句並且減輕服務器計算符合^&^
    }
  }
}
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved