日期:2014-05-18  浏览次数:20362 次

急急急~~~~DataTable 执行SQL语句问题
现在有一个带数据的DataTable,我想对它执行查询并分组,如:select   count(*)   as   ss,kz,cc   from   wzxls   group   by   kz,cc,然后得到kz,cc(两个字段组合成一种类型)类型的总数,有没有什么方法可以做到,其它方法也可以,只要从内存中直接取DataTable的值,能提高速度就可以。
先谢谢各位啦~~~

------解决方案--------------------
DataTable.Select 方法不支持 GROUP BY 字句
------解决方案--------------------
执意要DataTable 直接实现,

可以考虑使用通过 DataRelation 建立父子表,并在子表那边建立一个计算列,设置其 Expression = "COUNT(*) "

两表的关联外建列为,kz 和 cc 复合列
------解决方案--------------------
好像没有什么好的解决办法。

myDataTable.select( "ID> 1 "),这样可以取得记录数组。
或者用DataView
DataView myview1 = new DataView();
myview1.Table = myDataTable;
myview1.AllowDelete = true;
myview1.AllowEdit = true;
myview1.AllowNew = true;
myview1.RowFilter = "Kind= '1 ' ";
myview1.Sort = "ID ASC ";

myDataTable.Compute( "Sum(LibCount) ", "LibCount > -1 ").ToString()这样能对它计算。
这样做都一个缺点,就是分组字段的值如果事先不知道的情况下,只能用遍历。
------解决方案--------------------
HOW TO: Implement a DataSet GROUP BY Helper Class in Visual C# .NET
http://support.microsoft.com/kb/326145
------解决方案--------------------
protected void Page_Load(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.Columns.Add( "name "); dt.Columns.Add( "name1 "); dt.Columns.Add( "amount ",typeof(int)); dt.Rows.Add( "a ", "A ", 1); dt.Rows.Add( "a ", "A ", 3); dt.Rows.Add( "a ", "B ",2); dt.Rows.Add( "a ", "B ", 4); dt.Rows.Add( "b ", "A ", 10); dt.Rows.Add( "b ", "A ", 3); dt.Rows.Add( "b ", "B ",5); dt.Columns.Add( "c ", typeof(string), "name+name1 "); DataTable dt1 = GroupByField(ref dt, "c ", "amount "); DataGrid dg = new DataGrid(); dg.DataSource = dt1.DefaultView; dg.DataBind(); this.form1.Controls.Add(dg); } DataTable GroupByField(ref DataTable dt, string GroupFieldName,string SumFieldName) { DataView dv = dt.DefaultView; dv.Sort = GroupFieldName; DataTable dtRet = new DataTable(); dtRet.Columns.Add(GroupFieldName); dtRet.Columns.Add(SumFieldName,typeof(int)); string sGroupValue = string.Empty; foreach (DataRowView row in dv) { sGroupValue = row[GroupFieldName].ToString(); if (dtRet.Select(GroupFieldName + "= ' " + sGroupValue + " ' ").Length == 0) { dtRet.Rows.Add(sGroupValue, ConvertToInt32(dt.Compute( "sum( " + SumFieldName + ") ", GroupFieldName + "= ' " + sGroupValue + " ' "))); } } return dtRet; } int ConvertToInt32(object o) { if (o == DBNull.Value) return 0; else return Convert.ToInt32(o); }