DataRelation(DataSet中父子表)的一个示例

  System.Data.DataRelation 类,表示两个 DataTable 对象之间的父/子关系。在常见的查询中,可以利用sql2005/2008的CTE应用来进行递归查询,

这里有一个典型示例:http://www.cnblogs.com/downmoon/archive/2009/10/23/1588405.html

  此外,在数据量不大的情况下,也可以用DataRelation进行主子表或父子表的关联,参看下例:

  假定:有两张表请假类型LeaveType和请假表Leave

  这里是一个表结构的SQL: 

 

代码
create   table  LeaveType (
   PKID                 
int                    identity ( 1 , 1 ),
   TypeName             
nvarchar ( 50 )          null ,
   CurState             
smallint               not   null   default   0 ,
   
constraint  PK_LEAVETYPE  primary   key  (PKID)
)
go

create   table  Leave (
   PKID                 
int                    identity ( 1 , 1 ),
   Title                
nvarchar ( 50 )          null ,
   Reason               
nvarchar ( 254 )         null ,
   LoginID              
nvarchar ( 50 )          null ,
   LeaveTypeID            
int  ,
   DepartID             
int                    null ,
   EmployeeID           
int                    null ,
   AddTime              
datetime               null ,
   BeginTime            
datetime               null ,
   EndTime              
datetime               null ,
   TBeginDate           
datetime               null ,
   TEndDate             
datetime               null ,
   Remark               
nvarchar ( 1000 )        null ,
   ModUser              
nvarchar ( 50 )          null ,
   ModTime              
datetime               null ,
   CurState             
smallint               not   null   default   0 ,
   
constraint  PK_LEAVE  primary   key  (PKID)
)
go

  再插入一些测试数据:
  

代码
truncate   table  LeaveType
insert   into  
LeaveType 
select   ' 事假 ' , 1   union   all
Select   ' 病假 ' , 1   union   all
select   ' 婚假 ' , 1   union   all
select   ' 产假 ' , 1   union   all
select   ' 特休假 ' , 1  

go

Insert   into  Leave
select   ' 请假 ' + Convert Nvarchar ( 11 ), dateadd (dd, - 500 , getdate ()), 120 ), ' 准备与方鸿渐结婚 ' , ' 孙嘉柔 ' , 3 , 1 , 1909 , getdate (), ' 2010-1-1 ' , ' 2012-1-1 ' , ' 2010-1-1 ' , ' 2012-1-1 ' ,
' 这回铁了心了 ' , ' 孙嘉柔 ' , getdate (), 1
union   all
select   ' 回娘家 ' + Convert Nvarchar ( 11 ), dateadd (dd, - 200 , getdate ()), 120 ), ' 准备为方鸿渐生孩子 ' , ' 孙嘉柔 ' , 4 , 1 , 1909 , getdate (), ' 2010-1-1 ' , ' 2012-1-1 ' , ' 2010-1-1 ' , ' 2012-1-1 ' ,
' 这回铁了心了 ' , ' 孙嘉柔 ' , getdate (), 1
union   all  
select   
' 回娘家 ' + Convert Nvarchar ( 11 ), dateadd (dd, - 10 , getdate ()), 120 ), ' 准备与方鸿渐离婚 ' , ' 孙嘉柔 ' , 1 , 1 , 1909 , getdate (), ' 2010-1-1 ' , ' 2012-1-1 ' , ' 2010-1-1 ' , ' 2012-1-1 ' ,
' 这回铁了心了 ' , ' 孙嘉柔 ' , getdate (), 1
union   all
select   ' 回娘家 ' + Convert Nvarchar ( 11 ), dateadd (dd, - 2 , getdate ()), 120 ), ' 准备与方鸿渐离婚 ' , ' 孙嘉柔 ' , 2 , 1 , 1909 , getdate (), ' 2010-1-1 ' , ' 2012-1-1 ' , ' 2010-1-1 ' , ' 2012-1-1 ' ,
' 这回铁了心了 ' , ' 孙嘉柔 ' , getdate (), 1

union   all
select   ' 回娘家 ' + Convert Nvarchar ( 11 ), getdate (), 120 ), ' 准备与方鸿渐离婚 ' , ' 孙嘉柔 ' , 2 , 1 , 1909 , getdate (), ' 2010-1-1 ' , ' 2012-1-1 ' , ' 2010-1-1 ' , ' 2012-1-1 ' ,
' 这回铁了心了 ' , ' 孙嘉柔 ' , getdate (), 1

update  Leave  set  Title = ' ' + cast (PKID  as   nvarchar ( 10 )) + ' ' + Title

 

  查询主要代码如下:

 

代码
 protected void Page_Load(object sender, EventArgs e)
        {

            SqlConnection objConn 
=   default (SqlConnection);
            SqlDataAdapter da 
=   default (SqlDataAdapter);
            DataSet ds 
=   default (DataSet);
           
// DataRow dtrParent  =   default (DataRow);
            
// DataRow dtrChild  =   default (DataRow);

            objConn 
=  new SqlConnection(System.Configuration.ConfigurationManager.AppSettings [ "Testdb" ] );
            da 
=  new SqlDataAdapter(" SELECT   *   FROM  LeaveType", objConn);
            ds 
=  new DataSet();
            try
            {
                objConn.
Open ();
                da.Fill(ds, "LeaveTypes");
                da.SelectCommand 
=  new SqlCommand(" SELECT   *   FROM  Leave", objConn);
                da.Fill(ds, "Leaves");
            }
            catch (SqlException exc)
            {
                Response.Write(exc.ToString());
            }
            finally
            {
                objConn.Dispose();
            }

            
Create  the Data Relationship
            ds.Relations.
Add ("Type_Leave", ds.Tables [ "LeaveTypes" ] .Columns [ "PKID" ] , ds.Tables [ "Leaves" ] .Columns [ "LeaveTypeID" ] );

            
Display the Category  and  Child Products Within
            foreach (DataRow drParent 
in  ds.Tables [ "LeaveTypes" ] .Rows)
            {
                lblDisplay.
Text   +=  " < h3 > +  drParent [ "TypeName" ]   +  " </ h3 >< ul > ";
                foreach (DataRow drChild 
in  drParent.GetChildRows("Type_Leave"))
                {
                    lblDisplay.
Text   +=  " < li > +  drChild [ "loginID" ]   +  drChild [ "Title" ]   +  drChild [ "Reason" ]   +  " </ li > ";
                }
                lblDisplay.
Text   +=  " </ ul > ";

            }

        }

 

 

   最终效果:

 

  

  关于DataRelation 更多说明,请查阅MSDN:

  http://msdn.microsoft.com/zh-cn/library/system.data.datarelation%28VS.80%29.aspx

   另外,关于GridView的分组显示,可以参考;http://www.cnblogs.com/downmoon/archive/2008/08/26/1276538.html

转载于:https://www.cnblogs.com/downmoon/archive/2009/12/27/1633302.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值