①首先建立两个表一个为父表,一个为子表
父表
CREATE TABLE [T2] (
[a] [varchar] (50) NULL ,
[b] [int] NOT NULL ,
[c] [int] NOT NULL ,
CONSTRAINT [PK_T2] PRIMARY KEY CLUSTERED
(
[c],
[b]
) ON [PRIMARY]
) ON [PRIMARY]
GO
子表
CREATE TABLE [T3] (
[c] [int] NOT NULL ,
[d] [int] NULL ,
CONSTRAINT [PK_T3] PRIMARY KEY CLUSTERED
(
[c]
) ON [PRIMARY]
) ON [PRIMARY]
GO
②向父表和子表分别插入数据
insert into t2(a,b,c)
select 'b',6,1
union all
select 'a',1,2
union all
select 'c',5,3
insert into t3(c,d)
select 2,88
到此时为止我们插入的数据都是正常数据,即 对于共同列名C而言,父表T2包含了T3中C的全部值。
③数据正常,利用DataRelation正常操作如下:
DataSet public_ds =new DataSet();
SqlConnection conn =new SqlConnection("server=.;Initial Catalog=a; User ID =sa; Password=sa");
SqlCommand cmd=new SqlCommand("select * from t2",conn);
sda=new SqlDataAdapter(cmd);
sda.Fill(public_ds, "aa");
string strsql="select * from t3";
sda= new SqlDataAdapter(strsql,conn);
sda.Fill(public_ds,"bb");
DataRelation dr = new DataRelation("ab",public_ds.Tables["aa"].Columns["c"],public_ds.Tables["bb"].Columns["c"]);
public_ds.Relations .Add(dr);
this.dataGrid1.SetDataBinding(public_ds,"aa");
到此后都是正确的。
下面我们把T3表当成父表,T2作为主表,同样执行上述代码,不过红色部分要替换为下述语句:
DataRelation dr = new DataRelation("ab",public_ds.Tables["bb"].Columns["c"],public_ds.Tables["aa"].Columns["c"]);
这时就会出现我们的错误。
如何解决呢,当然如果父表中的该C列全部包含子表中该C列数据再好不过,但是现实中却往往不是这样的。
这时要用到createConstraints属性了。其实在DataRelation dr = new DataRelation("ab",public_ds.Tables["bb"].Columns["c"],public_ds.Tables["aa"].Columns["c"]);中我们省略了一个参数,即createConstraints,它的值为Boolean值,默认不写省略的情况下为True,如果我们把它手动写为false 上述不论谁为父表也不会抱错了。
更改代码如下:DataRelation dr = new DataRelation("ab",public_ds.Tables["bb"].Columns["c"],public_ds.Tables["aa"].Columns["c"],false);
同时如果设置了createConstraints 标志为false 还可以避免另一种错误的出现 即これらの列には現在一意の値が含まれていません,该错误是如何出现的呢?
我们把上述建立的表T2 清空重新插入数据
TRUNCATE table T2;
insert into t2(a,b,c)
select 'b',6,1
union all
select 'a',1,2
union all
select 'c',5,2