高分求将dataset中的3个datatable合并成一个表的方法

ltxyxj 2008-07-02 08:33:07
3个datatable的结构不一样,有可能一个table 有4行,另一个只有2行。
求教高人啊
...全文
221 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoulinli915 2012-05-22
  • 打赏
  • 举报
回复
你知道各表的结构,那就自己想办法合并了,用程序循环来实现,好像没有tab+tab就能合并的方法。
brz97 2008-07-03
  • 打赏
  • 举报
回复
上面有两行逻辑错误,请楼主改用下面的代码

public class Utils
{
public static DataTable Merge(params DataTable[] tables)
{
DataTable table3 = new DataTable();
int rowCount = 0;
foreach (DataTable t in tables)
{
foreach (DataColumn c in t.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
}
rowCount = t.Rows.Count > rowCount ? t.Rows.Count : rowCount;
}


for (int i = 0; i < rowCount; i++)
{
object[] rowItems = new object[table3.Columns.Count];
object[] obj = null;
int index = 0;
foreach (DataTable t in tables)
{
obj = t.Rows.Count > i ? t.Rows[i].ItemArray : new object[t.Columns.Count];
obj.CopyTo(rowItems, index);
index += obj.Length;
}
table3.Rows.Add(rowItems);
}
return table3;
}
}

//测试代码
public static void Main(String[] args)
{
DataTable table1 = new DataTable(); //1行6列
table1.Columns.Add("a1");
table1.Columns.Add("a2");
table1.Columns.Add("a3");
table1.Columns.Add("a4");
table1.Columns.Add("a5");
table1.Columns.Add("a6");
table1.Rows.Add(new object[] { 1,2,3,4,5,6});


DataTable table2 = new DataTable(); //2行2列
table2.Columns.Add("b1");
table2.Columns.Add("b2");
table2.Rows.Add("b1", "b2");
table2.Rows.Add("b1", "b2");

DataTable t = new DataTable(); //3行2列
t.Columns.Add("c1");
t.Columns.Add("c2");
t.Rows.Add("c1", "c2");
t.Rows.Add("c1", "c2");
t.Rows.Add("c1", "c2");

DataTable table3 = Utils.Merge(table1, table2,t);//合并三个表生成新表

//循环输出表中内容,如果为空值输出一个空格
foreach (DataRow r in table3.Rows)
{
for (int i = 0; i < table3.Columns.Count; i++)
{
object obj = r[i];
Console.Write(string.IsNullOrEmpty(r[i].ToString())?" ":r[i].ToString());
}
Console.WriteLine();
}

}

brz97 2008-07-03
  • 打赏
  • 举报
回复

public class Utils
{
public static DataTable Merge(params DataTable[] tables)
{
DataTable table3 = new DataTable();
int rowCount = 0;
foreach (DataTable t in tables)
{
foreach (DataColumn c in t.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
}
rowCount = t.Rows.Count > rowCount ? t.Rows.Count : rowCount;
}


for (int i = 0; i < rowCount; i++)
{
object[] rowItems = new object[table3.Columns.Count];
object[] obj = null;
int index = 0;
foreach (DataTable t in tables)
{
obj = t.Rows.Count > i ? t.Rows[i].ItemArray : new object[t.Columns.Count];
obj.CopyTo(rowItems, index);
index += obj.Length;
}
table3.Rows.Add(rowItems);
}
return table3;
}
}

brz97 2008-07-03
  • 打赏
  • 举报
回复
我又改善了一下,原来好像行数不同的确会出问题,现在好了

调用的时候DataTable newTable = Utils.Merge(你的表1,你的表2);



public class Utils
{
public static DataTable Merge(DataTable table1, DataTable table2)
{
DataTable table3 = new DataTable();
foreach (DataColumn c in table1.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
}
foreach (DataColumn c in table2.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);
}

for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++)
{
object[] o = table1.Rows.Count > i + 1 ? table1.Rows[i].ItemArray : new object[table1.Columns.Count];
object[] o2 = table2.Rows.Count > i + 1 ? table2.Rows[i].ItemArray : new object[table2.Columns.Count];
object[] o3 = new object[o.Length + o2.Length];
o.CopyTo(o3, 0);
o2.CopyTo(o3, o.Length);
table3.Rows.Add(o3);
}
return table3;
}
}



多说一句,我只是按照楼主的思路提供解决办法而已

其实我觉得最好的解决方法是在数据库查询的时候就直接返回一张表不就行了嘛

select * from 表1,表2,表3//返回一张表,包括表1,表2,表3中的所有内容(不去掉重复列)
live_7sky 2008-07-03
  • 打赏
  • 举报
回复


楼上的有道理 ,构造一个新的 TABLE,然后把 所有的列 加进去 。
brz97 2008-07-02
  • 打赏
  • 举报
回复
好像是同一个人? http://topic.csdn.net/u/20080701/19/a7172ac7-b943-490f-b9d4-39fb5546caa4.html
难道想让我重复拿分?^_^


DataTable table1 = new DataTable();
table1.Columns.Add("a1");
table1.Columns.Add("a2");
table1.Columns.Add("a3");
table1.Columns.Add("a4");
table1.Columns.Add("a5");
table1.Columns.Add("a6");
table1.Rows.Add(new object[] { 1,2,3,4,5,6});


DataTable table2 = new DataTable();
table2.Columns.Add("b1");
table2.Columns.Add("b2");

table2.Rows.Add(new object[] { "b1", "b2" });

DataTable table3 = new DataTable();
foreach (DataColumn c in table1.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);//先添加的table1的Columns
}
foreach (DataColumn c in table2.Columns)
{
table3.Columns.Add(c.ColumnName, c.DataType);//后添加的table2的Columns
}

for (int i = 0; i < table1.Rows.Count || i < table2.Rows.Count; i++)
{
//取值的时候先取table1,再取table2
object[] o = table1.Rows[i] == null ? new object[table1.Columns.Count] : table1.Rows[i].ItemArray;
object[] o2 = table2.Rows[i] == null ? new object[table2.Columns.Count] : table2.Rows[i].ItemArray;
object[] o3 = new object[o.Length + o2.Length];
o.CopyTo(o3,0);//copy的时候先copy table1
o2.CopyTo(o3, o.Length);//再copy table2(与前面的列对应)
table3.Rows.Add(o3);
}

halk 2008-07-02
  • 打赏
  • 举报
回复
你说的结构不一样,到底是指列(column)的数据类型和数量不一样,还是仅仅是指两个表的记录数一个多一个少?如果列的数量和类型完全相同,楼上方法可行。
amandag 2008-07-02
  • 打赏
  • 举报
回复
3个datatable的结构不一样,有可能一个table 有4行,另一个只有2行。
==
结构不一样,是列数一样吧

可以使用DataTable的Merge方法合并数据

62,041

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术交流专区
javascript云原生 企业社区
社区管理员
  • ASP.NET
  • .Net开发者社区
  • R小R
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

.NET 社区是一个围绕开源 .NET 的开放、热情、创新、包容的技术社区。社区致力于为广大 .NET 爱好者提供一个良好的知识共享、协同互助的 .NET 技术交流环境。我们尊重不同意见,支持健康理性的辩论和互动,反对歧视和攻击。

希望和大家一起共同营造一个活跃、友好的社区氛围。

试试用AI创作助手写篇文章吧