请教主从表同时插入数据的问题

great_king 2009-09-03 01:17:02
例如插入订单,订单由订单主表和订单从表组成。

通常一条订单主表对多条订单从表,订单主表中ID是自动数据库生成,在订单从表中有一个订单主表的外键。我们插入时先插入订单主表,然后将该根据该主表自动生成的ID写入的哦从表记录的主表的外键字段。

现在的问题是如何取得主表自动生成的ID。如果通过数据库触发器来做就比较容易啦,直接在触发器中取得inserted表中的ID字段就可以啦。但是如果是在程序中取就比较困难啦。当然我们可以通过取得主表ID字段中最大一个值来获得主表ID。

但是这样做的弊病也是明显的,程序和数据库是异步执行的,当我们取得主表ID字段中最大一个值的动作发生时,有可能数据库还没有执行完成前面的插入动作,所以我们取得的主表ID字段中最大一个值并不一定是我们刚刚插入的那个。如果是网络多个用户同时向数据库中插入,那么我们取得的最大一个ID,也不一定会是我们刚刚插入的那一个。

有没有一个比较完美的做法,能让主从表同时插入,并且将主表ID写入到从表外键中。
...全文
275 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
great_king 2009-09-04
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 sql77 的回复:]
INSERT INTO UserInfo  (Name) VALUES (@Name); 
select  SCOPE_IDENTITY();


你去联机丛书看一下,还有几个,看哪一种适合
[/Quote]
通过查询资料,发现用SCOPE_IDENTITY()最合适,因为它取当前作用域生成的最新id,不会去取他作用域的id。这样,及时同时有多个用户插入并生成啦id,也不会错误把别人的id取回来。
一品梅 2009-09-03
  • 打赏
  • 举报
回复
cmd.ExecuteScalar()返回记录组第一条记录第一列值.
cc_net 2009-09-03
  • 打赏
  • 举报
回复
搞定就好,另外主键不用自增建,用GUID就没有这个问题
SQL77 2009-09-03
  • 打赏
  • 举报
回复
INSERT INTO UserInfo (Name) VALUES (@Name);
select SCOPE_IDENTITY();


你去联机丛书看一下,还有几个,看哪一种适合
mjp1234airen4385 2009-09-03
  • 打赏
  • 举报
回复
我最喜欢这样的贴了。
自己搞定。
另外可以通过存储过程来处理,让存储过程返回id
great_king 2009-09-03
  • 打赏
  • 举报
回复
方法已经找到,sqlserver给我们准备一个很好的函数 SCOPE_IDENTITY()。通过它我们可以很方便的取得最新的插入id号。


INSERT INTO UserInfo (Name) VALUES (@Name);
select SCOPE_IDENTITY();

然后在程序中使用


SqlCommand cmd = new SqlCommand();
....
int id=Convert.ToInt16(cmd.ExecuteScalar());


就可以取得
惜玉 2009-09-03
  • 打赏
  • 举报
回复
每天回帖即可获得10分可用分!
========================

頂。
sz_xd 2009-09-03
  • 打赏
  • 举报
回复
up

110,571

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧