向两张表插入

pjkimi 2008-12-19 10:27:19
比方说有两张表A和B。A中有一个字段为ID(自动增长),B中也有一个字段为ID(与A对应,外键),现在我要输入一些数据到两个表中,先将一部分数据插入A表得到一个自增长后的ID,然后用这个ID和剩下的数据结合插入B表。 实现这个过程最简单的方法(如果不用存储过程),我现在的想法是插入a表获取最大的id,但是如果在这时又有人插入数据,这个id就不对了,如何解决
...全文
126 20 打赏 收藏 转发到动态 举报
写回复
用AI写文章
20 条回复
切换为时间正序
请发表友善的回复…
发表回复
tchong1225 2011-06-23
  • 打赏
  • 举报
回复
飘过,散客游
software820830 2008-12-19
  • 打赏
  • 举报
回复
用事务吧,先插进去一行数据到A表,然后再把ID最大的抽出来,再插入B表,如果有问题就回滚就OK
浮生若梦丶 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 11 楼 lh2907883 的回复:]
这种东西一定要使用存储过程来做,下面是例子
create proc InsertA_B
@data1 nvarchar(256),
@data2 nvarchar(256),
@data3 int,
@data4 bit
as
begin
begin transaction
insert into A values(@data1,@data2) --这里假设A表有3个字段(ID(自增长的),data1,data2)
insert into B values(@@identity,@data3,@data4) --这里假设B表有3个字段(ID(A表ID的外键),data3,data4)
i…
[/Quote]
推荐在存储过程中使用事务处理
ou108 2008-12-19
  • 打赏
  • 举报
回复
做好唯一索引
zgke 2008-12-19
  • 打赏
  • 举报
回复
插入语句;SELECT IDENT_CURRENT('表名') as 'Identity'
ou108 2008-12-19
  • 打赏
  • 举报
回复
用事务就行了,一般不会出错,出错就回滚。
mpf1985 2008-12-19
  • 打赏
  • 举报
回复
给程序加上事务锁
对月成双 2008-12-19
  • 打赏
  • 举报
回复
插入A表的时候,参数应该是整个对象:

string sqlA = insert into tableA values(A.属性1,A.属性2,...)

这样子最容易得到A的自动增长ID,然后可根据A的ID,继续插入B表:

string sqlB = insert into tableB values(A.ID,B.属性1,B.属性2,...)
lovehongyun 2008-12-19
  • 打赏
  • 举报
回复
string sql = "insert into table1 (name) values('a');select SCOPE_IDENTITY()";
SqlCommand cmd = new SqlCommand(sql,conn);
cmd.ExecuteScalar();//这里执行完后返回的就是你要的id了.


sqlcommand的ExecuteReader,ExecuteScalar方法执行都可以.
lh2907883 2008-12-19
  • 打赏
  • 举报
回复
这种东西一定要使用存储过程来做,下面是例子
create proc InsertA_B
@data1 nvarchar(256),
@data2 nvarchar(256),
@data3 int,
@data4 bit
as
begin
begin transaction
insert into A values(@data1,@data2) --这里假设A表有3个字段(ID(自增长的),data1,data2)
insert into B values(@@identity,@data3,@data4) --这里假设B表有3个字段(ID(A表ID的外键),data3,data4)
if @@error != 0
rollback transaction
else
commit transaction
end
lovehongyun 2008-12-19
  • 打赏
  • 举报
回复
例如:

CREATE TABLE [table1] (
[id] [int] IDENTITY (1, 1) NOT NULL ,
[name] [varchar] (50) NULL ,
CONSTRAINT [PK_table1_1] PRIMARY KEY CLUSTERED
(
[id]
) ON [PRIMARY]
) ON [PRIMARY]


insert into table1 (name) values('a');select SCOPE_IDENTITY()--这语句执行后获得的就是我刚插入的id
wzy_love_sly 2008-12-19
  • 打赏
  • 举报
回复

create proc proc_name
as
begin
begin tran
declare @id int
insert into ta(id,name) select 1,'a'
set @id=scope_identity()
insert into tb(id,name) select @id,'b'
commit tran
end
周公 2008-12-19
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 lovehongyun 的回复:]
我现在的想法是插入a表获取最大的id,但是如果在这时又有人插入数据,这个id就不对了,如何解决
==========
如果id是自增的,应该是你的主键吧?

再insert完a表后不要用max(id)来取你插入的值.
要用SCOPE_IDENTITY(),
这样取出来后的id肯定是你刚插入的.无论再有没有人往里录数据都会是你刚才insert那条产生的id
[/Quote]
用这个办法好,实际中我也是这么做的。
lovehongyun 2008-12-19
  • 打赏
  • 举报
回复
我现在的想法是插入a表获取最大的id,但是如果在这时又有人插入数据,这个id就不对了,如何解决
==========
如果id是自增的,应该是你的主键吧?

再insert完a表后不要用max(id)来取你插入的值.
要用SCOPE_IDENTITY(),
这样取出来后的id肯定是你刚插入的.无论再有没有人往里录数据都会是你刚才insert那条产生的id
human_2 2008-12-19
  • 打赏
  • 举报
回复
hehe ,还是用存储过程吧,用了 就简单多了
shine_fly 2008-12-19
  • 打赏
  • 举报
回复
也可以用事务来处理啊...
            OracleConnection con = dbclass.GetOracleConnection();
OracleCommand com = new OracleCommand();

//用事务对数据进行多表插入
com.Connection = con;
com.Transaction = con.BeginTransaction();
try
{
//.....要插入的方法语句

com.Transaction.Commit();
return true;
}
catch (Exception ee)
{
com.Transaction.Rollback();

string error = ee.Message.Replace("'", " ");


return false;
}
pjkimi 2008-12-19
  • 打赏
  • 举报
回复
向a表插入的时候,正好同时又有其他数据向a表插入,此时获取的最大id不就是其他数据的最大id了,就不准确了
大头_衍 2008-12-19
  • 打赏
  • 举报
回复
哦,看错题了。呵呵
大头_衍 2008-12-19
  • 打赏
  • 举报
回复
先插入到A表然后在插入到B表。
插入A表后再得到最大id,
id会不对??
huangjie21 2008-12-19
  • 打赏
  • 举报
回复
使用事务可以解决

110,536

社区成员

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

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

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