如果一个数据库上有个表T,里面有三个属性NO1,NO2,Value
其中NO1 NO2联合作主键。如果把这个表读到DataTable中,根据MSDN的解释,可以反映出NO1,NO2为联合主键的表示是NO1列和NO2列的AllowDBNULL属性为false。但很明显,这无法能保证NO1和NO2联合为主键。仅仅表示他们非空。然而,当我尝试向表里添加(1,2,3)和(1,2,3)两行时,竟然发生异常说NO1,NO2 的主键约束遭到破坏。添加(1,2,3)和(1,3,3)两行时就没事。请问.Net自己凭什么知道哪几个是主键呢?.Net知道的方法我能不能拿来用。

解决方案 »

  1.   

    DataTable会根据数据库表内的约束,建立自己的约束
      

  2.   

    "根据MSDN的解释,可以反映出NO1,NO2为联合主键的表示是NO1列和NO2列的AllowDBNULL属性为false。"
    你理解错了吧....DataTable是你的表T建立主键的.....
    运行时你可以跟踪一下DataTable.PrimaryKey属性看一下主键...
      

  3.   

    当你从数据库中检索数据时,ADO.NET会自动根据数据库结构为DataTable建立一组约束。具体点说:
    DataTable 对象中会有一个称为 Constraints 的属性,该属性描述了数据库表的约束的集合,该集合中存有两种类型的数据:
    1、ForeignKeyConstraint - 表示删除或更新某个值或行时,对主键/外键关系中一组列强制进行的操作限制
    2、UniqueConstraint - 表示对一组列的限制,列中的所有值必须是唯一的。
      

  4.   

    至于主键,在 DataTable.PrimaryKey 数组中描述。
      

  5.   

    可似乎PrimaryKey是个只写属性,并没有一个数据直接支持PrimaryKey
      

  6.   

    嗯,找到了,是Contraints里有一个列表对应“NO1”“NO2”,另外Constraint的IsPrimaryKey是true