两个DataTable连接实例

static void Main(string[] args)
        {
            DataTable dt = GetData(); //组织父表数据

            DataTable dtDetail = GetDetailData();//组织子表数据

            try
            {
                string parentFieldName = "ID";
                string relationFieldName = "d_ParentID";
                DataTable joinDt = JoinData(dt, dtDetail, parentFieldName, relationFieldName, false);// 合并表数据
                Console.Write("sucess");
            }
            catch (Exception ex)
            { }
        }

 

        //组织父表数据

        private static DataTable GetData()
        {
            DataTable dt = new DataTable();
            dt.Columns.Add(new DataColumn("ID", Type.GetType("System.Int32")));
            dt.Columns.Add(new DataColumn("Code", Type.GetType("System.String")));
            dt.Columns.Add(new DataColumn("Name", Type.GetType("System.String")));

            DataRow dr = null;
            for (int i = 0; i < 10; i++)
            {
                dr = dt.NewRow();
                dr["ID"] = i;
                dr["Code"] = i;
                dr["Name"] = i;
                dt.Rows.Add(dr);
            }
            return dt;
        }

 

        //组织子表数据

        private static DataTable GetDetailData()
        {
            DataTable dtDetail = new DataTable();
            dtDetail.Columns.Add(new DataColumn("d_ID", Type.GetType("System.Int32")));
            dtDetail.Columns.Add(new DataColumn("d_ParentID", Type.GetType("System.Int32")));
            dtDetail.Columns.Add(new DataColumn("d_Code", Type.GetType("System.String")));
            dtDetail.Columns.Add(new DataColumn("d_Name", Type.GetType("System.String")));
            DataRow dr = null;
            for (int i = 0; i < 5; i++)
            {
                dr = dtDetail.NewRow();
                dr["d_ID"] = 2 * i;
                dr["d_ParentID"] = 2 * i;
                dr["d_Code"] = 2 * i;
                dr["d_Name"] = 2 * i;
                dtDetail.Rows.Add(dr);
            }

            return dtDetail;
        }

 

        /// <summary>
        /// 合并表数据
        /// </summary>
        /// <param name="dt">合并主表</param>
        /// <param name="dtDetail">合并明细表</param>
        /// <param name="isInnerJoin">是否内联</param>
        /// <returns>DataTable</returns>
        private static DataTable JoinData(DataTable dt, DataTable dtDetail, string parentFieldName, string relationFieldName, bool isInnerJoin)
        {
            DataTable joinDt = new DataTable();

            try
            {
                using (DataSet ds = new DataSet())
                {
                    ds.Tables.AddRange(new DataTable[] { dt, dtDetail });

                    DataRelation relation = new DataRelation("MasterRelation", dt.Columns[parentFieldName], dtDetail.Columns[relationFieldName], false);
                    ds.Relations.Add(relation);

                    for (int i = 0; i < dt.Columns.Count; i++)
                    {
                        joinDt.Columns.Add(dt.Columns[i].ColumnName, dt.Columns[i].DataType);
                    }
                    for (int i = 0; i < dtDetail.Columns.Count; i++)
                    {
                        joinDt.Columns.Add(dtDetail.Columns[i].ColumnName, dtDetail.Columns[i].DataType);
                    }


                    joinDt.BeginLoadData();
                    foreach (DataRow firstrow in ds.Tables[0].Rows)
                    {
                        //得到行的数据
                        DataRow[] childrows = firstrow.GetChildRows(relation);
                        object[] parentarray = firstrow.ItemArray;
                        if (childrows != null && childrows.Length > 0)
                        {
                            foreach (DataRow childrow in childrows)
                            {
                                object[] childarray = childrow.ItemArray;
                                object[] joinarray = new object[parentarray.Length + childarray.Length];
                                Array.Copy(parentarray, 0, joinarray, 0, parentarray.Length);
                                Array.Copy(childarray, 0, joinarray, parentarray.Length, childarray.Length);
                                joinDt.LoadDataRow(joinarray, true);
                            }
                        }
                        else
                        {
                            if (!isInnerJoin)
                            {
                                joinDt.LoadDataRow(parentarray, true);
                            }
                        }
                    }
                    joinDt.EndLoadData();
                }
            }
            catch (Exception ex)
            {
                throw ex;
            }

            return joinDt;
        }

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值