DataTable Dt1 = GetPaiHangTop10(Convert.ToInt32(Number));
DataTable Dt2 = GetPaiHangCompare(Convert.ToInt32(Number));想要把这两个数据源用Dt1.Columns["JournalID"]、Dt2.Columns["JID"]连接起来,Dt2表中的数据有可能不完全配置Dt1(记录总数少于Dt1),如果出现Dt2无法找到与Dt1关连则向该字段填充一个默认值(0)。Dt1数据结构JournalID Name_CN Total64 园林工程64 150
2 园林工程2 ..
11 浙江绿化苗木11 ..
8 园林工程8 ..
1 浙江绿化苗木1 ..
7 浙江绿化苗木7 ..
10 园林工程10 ..
9 浙江绿化苗木9 ..
6 园林工程6 ..
3 浙江绿化苗木3 ..Dt2数据结构JID OldTotal1 20
2 20
3 40
7 20
8 30
10 30
11 30
DataTable Dt2 = GetPaiHangCompare(Convert.ToInt32(Number));想要把这两个数据源用Dt1.Columns["JournalID"]、Dt2.Columns["JID"]连接起来,Dt2表中的数据有可能不完全配置Dt1(记录总数少于Dt1),如果出现Dt2无法找到与Dt1关连则向该字段填充一个默认值(0)。Dt1数据结构JournalID Name_CN Total64 园林工程64 150
2 园林工程2 ..
11 浙江绿化苗木11 ..
8 园林工程8 ..
1 浙江绿化苗木1 ..
7 浙江绿化苗木7 ..
10 园林工程10 ..
9 浙江绿化苗木9 ..
6 园林工程6 ..
3 浙江绿化苗木3 ..Dt2数据结构JID OldTotal1 20
2 20
3 40
7 20
8 30
10 30
11 30
DataTable Dt2 = GetPaiHangCompare(Convert.ToInt32(Number));我想把两张表连起来,用Dt1的JournalID字段和Dt2的JID字段来关连JournalID Name_CN Total64 园林工程64 150
2 园林工程2 ..
11 浙江绿化苗木11 ..
8 园林工程8 ..
1 浙江绿化苗木1 ..
7 浙江绿化苗木7 ..
10 园林工程10 ..
9 浙江绿化苗木9 ..
6 园林工程6 ..
3 浙江绿化苗木3 ..Dt2数据结构JID OldTotal1 20
2 20
3 40
7 20
8 30
10 30
11 30 这样能看懂哇????
======
连接,有内连接,左右外连接,全外连接,交叉连接
你想的哪种................
我只能猜应该是左外连Dt2表中的数据有可能不完全配置Dt1(记录总数少于Dt1)
=========
又不懂什么叫完全配置
................
我猜你的意思是这是个一对(一或空)的对应关系(暗喻不可能一对多)
如果出现Dt2无法找到与Dt1关连则向该字段填充一个默认值(0)。
==============
.............
如果找不到dt2中对应的记录,则象(哪个字段)填充一个默认值?这个实实在在的猜不出来了
DataRelation dr = new DataRelation("FK_RELATION",Dt1.Columns["JournalID"],Dt2.Columns["JID"]);提示:“column”参数不能为空。参数名: column
Create View Dt1_Dt2 As
Select JournalID,Name_CN,Total,OldTotal
From Dt1 Left Join On Dt2
On Dt1.JournalID=Dt2.JID这样,如果Dt2有匹配行,则为原值,没有则为null。直接读视图Dt1_Dt2即可。
而且我再猜你是想将两个条合并成一个表,而不是要建立父子关系你要的是
JournalID Name_CN Total
2园林工程2 ..
1浙江绿化苗木1 ..
8园林工程8 JID OldTotal
1 20
2 20合并成JournalID Name_CN Total JID OldTotal
2 园林工程2 .. 2 20
1 浙江绿化苗木1 .. 1 20
8 园林工程8 .. 0 0
这样一张表而不是
成为
2 园林工程2 ..
______________________________
2 20
______________________________
1 浙江绿化苗木1 ..
______________________________
1 20
_______________________________
8 园林工程8
_______________________________
_______________________________
如果我猜得不对就很不好意思了
其实不管是合并表还是建立父子关系映射,很多人都可以帮你
但是事实上,我真的不知道你要的是什么,我相信上面也有很多热心人和我一样
真的不知道你说的是什么
2 园林工程2 .. 2 20
1 浙江绿化苗木1 .. 1 20
8 园林工程8 .. 0 0
对,就是这样
帮我看看应该怎么写吧,万分感谢!
using System.Collections.Generic;
using System.Text;
using System.Data;namespace UniteTable
{
class Program
{
static void Main(string[] args)
{
//Relations只能应用于同一dataSet的datatable之间
DataSet ds = new DataSet();
//创建子表
DataTable dtDetail = CreateDetail();
ds.Tables.Add(dtDetail);
//创建父表
DataTable dtMaster = CreateMaster();
//拷贝父表到结果表,如果不需要保留原始表,则可以直接操作父表
DataTable dtResult = dtMaster.Copy();
//从子表加入新的字段信息
foreach (DataColumn dc in dtDetail.Columns)
{
dtResult.Columns.Add(dc.ColumnName, dc.DataType);
}
//加入到结果集
ds.Tables.Add(dtResult);
//建立映射关系并加入到dataset
DataRelation dr = new DataRelation("dr", dtResult.Columns["JournalID"], dtDetail.Columns["JID"]);
ds.Relations.Add(dr);
//遍历结果表
foreach (DataRow drMaster in dtResult.Rows)
{
//得到明细记录
DataRow[] drDetails=drMaster.GetChildRows(dr);
//如果有明细,则取第一条,也可以遍历后取和值
if (drDetails.Length > 0)
{
foreach (DataColumn dc in dtDetail.Columns) {
drMaster[dc.ColumnName] = drDetails[0][dc.ColumnName];
}
}
//如果没有明细,这儿给的是空值,你也可以使用你的逻辑比如是0
else {
foreach (DataColumn dc in dtDetail.Columns)
{
drMaster[dc.ColumnName] = DBNull.Value;
}
}
}
//打印表头
foreach (DataColumn dc in dtResult.Columns) {
Console.Write("{0}\t", dc.ColumnName);
}
Console.WriteLine();
//打印记录集
foreach (DataRow drMaster in dtResult.Rows) {
foreach (DataColumn dc in dtResult.Columns) {
Console.Write("{0}\t", drMaster[dc.ColumnName]);
}
Console.WriteLine();
}
//至此结束
Console.Read();
}
static DataTable CreateMaster(){
DataTable dt = new DataTable();
dt.Columns.Add("JournalID", typeof(int));
dt.Columns.Add("Name_CN", typeof(string));
dt.Rows.Add(new object[] { 2,"园林工程2" });
dt.Rows.Add(new object[] { 1, "浙江绿化苗木1" });
dt.Rows.Add(new object[] { 8, "园林工程8" });
return dt;
}
static DataTable CreateDetail() {
DataTable dt = new DataTable();
dt.Columns.Add("JID", typeof(int));
dt.Columns.Add("OldTotal", typeof(int));
dt.Rows.Add(new object[] { 2, 20 });
dt.Rows.Add(new object[] { 1, 10 });
return dt;
}
}
}
DataRelation dr = new DataRelation("dr", Dt1.Columns["JournalID"], Dt2.Columns["JID"]);
Ds.Relations.Add(dr);错误信息:
“column”参数不能为空。参数名: column
说明: 执行当前 Web 请求期间,出现未处理的异常。请检查堆栈跟踪信息,以了解有关该错误以及代码中导致错误的出处的详细信息。 异常详细信息: System.ArgumentNullException: “column”参数不能为空。参数名: column
Dt1不存在名为JournalID的列
Dt2.Columns["JID"]
或者Dt2不存在名为JID的列
Dt2记录可能不完全匹配Dt1(Dt2记录数少于Dt1)
这种情况下更适合遍历
using System.Collections.Generic;
using System.Text;
using System.Data;namespace UniteTable
{
class Program
{
static void Main(string[] args)
{
DataTable dtMaster = CreateMaster();
DataTable dtDetail = CreateDetail();
DataTable dtResult = dtMaster.Copy();
foreach (DataColumn dc in dtDetail.Columns)
{
dtResult.Columns.Add(dc.ColumnName, dc.DataType);
} foreach (DataRow drMaster in dtResult.Rows) {
bool updated = false;
foreach (DataRow drDetail in dtDetail.Rows) {
if ((int)drDetail["JID"] == (int)drMaster["JournalID"]) {
drMaster["JID"] = drDetail["JID"];
drMaster["OldTotal"] = drDetail["OldTotal"];
updated = true;
break;
}
}
if (!updated) {
drMaster["JID"] = drMaster["JournalID"];
drMaster["OldTotal"] =0;
} }
//打印表头
foreach (DataColumn dc in dtResult.Columns) {
Console.Write("{0}\t", dc.ColumnName);
}
Console.WriteLine();
//打印记录集
foreach (DataRow drMaster in dtResult.Rows) {
foreach (DataColumn dc in dtResult.Columns) {
Console.Write("{0}\t", drMaster[dc.ColumnName]);
}
Console.WriteLine();
}
Console.Read();
}
static DataTable CreateMaster(){
//JournalID
//Name_CN
DataTable dt = new DataTable();
dt.Columns.Add("JournalID", typeof(int));
dt.Columns.Add("Name_CN", typeof(string));
dt.Rows.Add(new object[] { 2,"园林工程2" });
dt.Rows.Add(new object[] { 1, "浙江绿化苗木1" });
dt.Rows.Add(new object[] { 8, "园林工程8" });
return dt;
}
static DataTable CreateDetail() {
DataTable dt = new DataTable();
dt.Columns.Add("JID", typeof(int));
dt.Columns.Add("OldTotal", typeof(int));
dt.Rows.Add(new object[] { 2, 20 });
dt.Rows.Add(new object[] { 1, 10 });
dt.Rows.Add(new object[] { 10, 100 });
return dt;
}
}
}