急急急~~~~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);
}