现在的位置: 首页 > 综合 > 正文

ADO.Net约束学习!

2012年03月14日 ⁄ 综合 ⁄ 共 1868字 ⁄ 字号 评论关闭
一.Unique约束
建立Unique约束有两种方式:
(1) UniqueConstraint uniqueContact=new UniqueConstraine(ds.Tables[0].Columns[0]);
       ds.Tables[0].Constraints.Add(uniqueContact);

(2)  ds.Tables[0].Columns[0].AlowDbNull=false;
      ds.Tables[0].Columns[0].Unique=true;

二.ForeignKeyConstraint外键约束
除了Unique约束外还有外键约束:ForengnKeyConstraint
外键约束建立完成后要加到子表的Constraints集合中,按理解来说,外键约束主要是对子表的数据完整性的约束,所以加到子表中的Constraints集合中是可以理解的.另外,在在子表中建立外键约束时,主表的父字段也会自动增加Unique的唯一性约束.

三.约束的更新规则
更新的规则有三种,它们都是应用在ForeignKeyConstraint上的属性.
(1) AcceptRejectRule:在DataTable或者DataRow调用AcceptChanges或RejectChanges时会引发这个规则的实施.
它有None和CasCade,前者不级联更新,但是违返规则时将引发异常.后者自动更新子表,如果更新则更新子表,如果删除将删除子表数据.
(2)DeleteRule和UpdateRule.分别有四个值的枚举,None,Cascade,SetNull,SetDefault,前二者同上,后二者自动设为Null或Default的值.

注:如果(2)的设定与(1)不符,例如将AcceptRejectRule设为Cascade,而UpdateRule设备SetNull,这将后引发不可预知的后果.因为后者已将子表设为Null,而前者就不做任何操作了.
更细致的控制我认为是应该将AcceptRejectRule设为None,而具体设定DeleteRule和UpdateRule,Cascade是UpdateRule和DeleteRule的默认值.None是AcceptRejectRule的默认值.

MSDN上的例子:
private void CreateConstraint(DataSet myDataSet, string table1, string table2,
                                                 string column1, string column2){
   // Declare parent column and child column variables.
   DataColumn parentColumn;
   DataColumn childColumn;
   ForeignKeyConstraint myForeignKeyConstraint;
   // Set parent and child column variables.
   parentColumn = myDataSet.Tables[table1].Columns[column1];
   childColumn = myDataSet.Tables[table2].Columns[column2];
   myForeignKeyConstraint = new ForeignKeyConstraint
      ("SupplierForeignKeyConstraint",  parentColumn, childColumn);
   // Set null values when a value is deleted.
   myForeignKeyConstraint.DeleteRule = Rule.SetNull;
   myForeignKeyConstraint.UpdateRule = Rule.Cascade;
   myForeignKeyConstraint.AcceptRejectRule = AcceptRejectRule.Cascade;
   // Add the constraint, and set EnforceConstraints to true.
   myDataSet.Tables[table1].Constraints.Add(myForeignKeyConstraint);
   myDataSet.EnforceConstraints = true;
}

抱歉!评论已关闭.