Vs2005中更新父子表标识列的问题

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吧,可是那么多列啊,当作参数可真麻烦,再郁闷,居然还是可空类型的。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值