曲欧的专栏

.Net 学习专栏

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

DataSet允许包含多个DataTable,而且这些DataTable可以存在父子关系。
问题描述:假设现在有2个表,部门(depart),员工(person)。
depart表结构如下:
departId   int   标识列
departName   nvarchar  

person表结构如下:
personId    int       标识列
personName  nvarchar  
departId    int       

---------------------------------------------------------
当我通过Vs2005的数据源设计器,把上述2个表加入后,IDE智能地通过读数据库信息正确的恢复了2表之间的关系(主外键关系),至此我可以使用类型化数据集了。

新的DataSet里现在有了2个DataTable,分别对应数据库里的depart和person表。在这2个DataTable的相关属性里,我们可以看见设计器已自动识别并对departId列和personId列指明了‘标识列’属性。
┌────────────────┐
│这里说明一点的是:DataTable的标 │      
│  识列的具体值和实际数据库标识列│        
│  的值并没有联系。              │
└────────────────┘
UI界面的设计:直接通过拖动数据源列表里相关表(关联的2个表),得到2个具有及联效果的dataGridView,通过在导航栏的Save按钮事件里稍作处理,即把2个表的update按主、子的顺序写好。至此涉及2个表的增删查改均完成。
=====================
问题来了:insert单条记录时,首先插入新的depart表数据,完成后,数据库新产生的标识值departId并没有‘传’给紧接下来欲插入person表的语句中。即,此时插入person表的新纪录中的departId值仍旧是DataTable的标识列值,而不是实际数据库所需的标识值。数据库此时会因为外键约束导致插入失败。

这种插入失败尤其在以下情况表现明显:例如,depart表中50条记录,在数据库里删除后面40条,则剩下编号为1~10的10条记录,这时标识列的下一个值应该是51。如果你此时运行上述程序,那么DataTable为其产生的下一个departId则为11,相应的person这个DataTable里的departId也为11。那么执行插入操作时,depart表记录正确插入(毕竟它知道标识列不用真正赋值),可是插入person表时,departId赋值为11可就报错了。

我尝试把depart表的insert写成存储过程,并out新生成的标识值,然后将这个参数属性定为output和DataTable里的departId列绑定。希望在我insert主表后,回传的值立刻更新子表departId,可是依旧不行。

-------我认为微软应该考虑到这个‘基本’需求的问题,也许是我哪里出错吧。---------
不行的话,我只有通过DataTable的GetChanges分离出insert,单独控制这些插入了。可是类型化数据集,它把insertCommand等都封装了,不能直接改参数值,郁闷,就用那个暴露的insert吧,可是那么多列啊,当作参数可真麻烦,再郁闷,居然还是可空类型的。。。

posted on 2006-08-15 22:37  曲欧  阅读(600)  评论(1编辑  收藏  举报