您现在的位置:龙卷风首页 ›› 网络编程 ›› 阅读文章

DataBind之前操控DataTable

操控DataTable实现跨表查询和统计文章数目

真正跟GridView和DataList组件绑定的,并不是DataSet,而是存储在DataSet中的DataTable。因此,即使没有DataSet,自己创建DataTable用于数据绑定也是可行的。

在根据网站分类统计文章总数的时候,发现了一个问题,由于既需要在网站分类表中读取网站分类的名称(ClassName)和旗帜(ClassFlag),有需要在文章表中统计同一个文章旗帜(ClassFlag)的文章数目(Count(id) group by ClassFlag),这两个视图无论如何都不能在同一个sql语句中实现,又不想用到储存过程,于是只能借助与DataTable进行程序层面的逻辑处理了。

首先是建立一个包含了两个视图的数据表DataTable t,然后添加必须的DataColumn,随后在循环中根据两个视图中ClassFlag相等的关系,进行匹配选择,创建DataRow,加入DataTable。例如:

        DataTable t = new DataTable("Aim");
        t.Columns.Add( new DataColumn("clsname",System.Type.GetType("System.String")) );
        t.Columns.Add( new DataColumn("flag", System.Type.GetType("System.Int32")));
        t.Columns.Add( new DataColumn("number", System.Type.GetType("System.Int32")));
       
        for (int i = 0; i < ds.Tables["ClassTable"].Rows.Count; i++)
        {
            DataRow r = t.NewRow();
            for (int j = 0; j < ds.Tables["ClassCount"].Rows.Count; j++)
            {
                if (ds.Tables["ClassTable"].Rows[i]["flag"].ToString().Equals(ds.Tables["ClassCount"].Rows[j]["flag"].ToString()))
                {
                    r[0] = ds.Tables["ClassTable"].Rows[i]["clsname"];
                    r[1] = ds.Tables["ClassTable"].Rows[i]["flag"];
                    r[2] = ds.Tables["ClassCount"].Rows[j]["number"];
                    break;
                }
            }
            t.Rows.Add(r);
        }

这样的实现有点笨拙,不过总算实现了预期的目的,绑定了DataList之后的显示效果:

业界新闻(51)
情感日记(147)
办公室援助(73)
网络编程(120)
长短句(116)
web标准(3)
计算机安全(3)
硬件|DIY(2)

其中ClassId的值、分类的名称、统计的数目就是来源与DataTable t。

不知道有没有比这更简单的实现方法呢,渴望赐教。

作者 林剑锋 本文仅代表作者观点,与龙卷风资讯网立场无关。

我来说两句

内容/Content