c#里的多表联查的列表显示

这个话题可能有点大,一上来都不知道应该起一个如何的标题,才算是能够涵盖今天这篇文章所想表达的中心思想。

公司里实际碰到的情况说起来可能有些复杂,转换个通俗易懂的实际问题来简述吧:如何在C#里展示新闻数据列表?(列表的每一行包括标题和新闻类别,新闻标题和正文的数据属于数据表A,新闻的类别标题属于数据表B)

呵呵,这个问题,可能大家会觉得在ASP世界里的时候,是再小儿科不过得问题了。应该是一上来就会碰到,并掌握的。是的,起初我也是这么认为的,并且带着同样的心态来到C#世界里来看待这个问题的。

然而,随之时间的推移,我发觉,这个问题,在C#里,并没有想象中那么容易。至少是不简单的。

首先,在ASP中,我们都记得只要建立记录集,然后就开始读每条新闻标题数据,然后读到类别ID的时候,再去另外张表中查找该ID相应的类别内容即可。但是,在C#世界里,首先要说的是,的确也可以用同样的方法实现,比如使用SqlDataReader对象来实现,只不过需要频繁打开conn,还要记得及时关闭。即,假如有100条新闻标题和新闻类别需要循环读出,那么至少需要100次的打开关闭类别表连接,外加一次新闻标题所在表的连接。如果不注意关闭,便极其容易瞬间将连接池资源耗尽。

因为这两天碰上过类似问题,所以认识了C#里的DataSet,它的好处是将数据表内容一次性读取出来,保存在内存中,然后瞬间自动关闭连接资源。页面中只要是使用同一个数据库中的资源,则不需要再次连接。DataSet的优势,在处理大数据的时候,将显得尤为突出。就比如100条新闻数据的类别查找和显示问题;又或者是某固定资产登记填写表中,许多个类别下拉框需要加载,而这些类别条目均来自同一数据库中的数据。如果使用SqlDataReader,那么有多少个下拉框,就需要建立多少个conn的打开和关闭,而用了Dataset就一次解决。

这里摘录一段来自一本名为《SQL 2005 数据库系统开发完全手册》中,一个ASP.NET+SQL SERVER 2005的实现物资管理系统的应用实例中的部分代码片段,作为参考:

在DB.cs类中有reDs方法:

public static DataSet reDs(string str)

{

SqlConnection conn=连接sql数据库语句;

conn.Open();

SqlDataAdapter da = new SqlDataAdapter(str, conn);

DataSet ds = new DataSet();

da.Fill(ds);

return ds; //返回DataSet对象

页面后端文件中有绑定数据到页面多个下拉框的一段代码:

public void Bind()

{

DataSet ds1=DB.reDs("select Title from tb_BigType where Type='仓库'");

ddlStroe.DataSource=ds1;

ddlStroe.DataTextField="Title";

ddlStroe.DataBind();

DataSet ds2=DB.reDs("select Title from tb_BigType where Type='部门'");

ddlIN.DataTextField="Title";

...

}

通过上述,可以看到,页面中至少有两个下拉框分别用于显示仓库名称列表和部门名称列表,这些数据都需要从数据库中某表中读取,如果用SqlDataReader实现,则需要创建两次conn,而这里用DataSet,则直接可以多次调用,而无需担心conn的关闭问题。

上面其实貌似有点讲偏了?如果分个章节标题的话,上述应该叫利用DataSet将数据绑定至页面多个下拉框列表。

下面讲利用DataSet将多表联查结果的列表显示。

今天白天在办公室里,一时没有头绪,结果使用了一个自创的方法:即用一次SqlDataReader循环读取新闻标题内容,然后在循环体重,每次需要读取类别信息表内容时,再创建一个SqlDataReader对象,当然也就需要再创建打开和关闭一次conn对象。然后将获取到的值一一抛出到html语言生成table所需要的td、tr元素。

这种方法虽然也实现了效果,但是里面觉得有两个地方应该是可以改进的:一是打开关闭了无数次conn,这个猜想应该是可以用DataSet解决的?!二是用循环体抛出

所需单元格html脚本,这个似乎是比较古老的ASP写法,完全抛开了ASP.NET的先进控件,猜想应该也是可以改进的?!

于是乎,在经过晚上挑灯夜战,一番看书后,有所领悟,仍旧是摘录一段代码,仍旧来自上面这本书:

protected void btnOK_Click(object sender, EventArgs e)

{

DataSet ds1=DB.reDs("select sum(A.Amount) as amount, sum(A.Pay) as pay from tb_StoreDetails as A inner join tb_Store as B on A.StoreID=B.StoreID");

//把汇总物资数量及入库金额分别赋予全局变量totalnum和totalmon

totalnum=ds1.Tables[0].Rows[0][0].ToString();

totalmon=ds1.Tables[0].Rows[0][1].ToString();

//根据符合条件的记录绑定到Datalist控件上

DataSet ds = Db.reDs("select distinct A.WzID, A.Name, A.Model, A.Spec, A.Card from tb_StoreDetails as A inner join tb_Store as B on A.StoreID=B.StoreID");

this.Datalist1.DataSource=ds;

this.Datalist1.DataBind();

}

上述示例代码中的核心思想其实很简单,就是通过多表SQL联查语句,一口气创建好DataSet,然后直接绑定到控件上去即可,随便你是Datalist, 还是DataGridView。。。

很精彩!明天继续!


你可能感兴趣的:(C#)