在一条SQL语句中向2个表中插入数据
表1 名称Bulletin,字段BulletinId(主键),Title,Content,Publisher
表2 名称ButtetinAuth,字段BulletinId(主键),UserId
怎么在一条SQL语句中想2个表中插入数据
请写具体点
"insert 表1;insert 表2 "这种方式是可以,但不能保证同步(如插入第一个表后就停电了,第二个表还没来得及插入,所以就不同步了),要数据同步就要用数据库事务。
private SqlConnection myConn = new SqlConnection(); //连接
private SqlTransaction Transaction = null; //事务
private SqlCommand Cmd = new SqlCommand();
假设myConn已经配置好
事务开始:
try
{
myConn.Open();
Transaction = myConn.BeginTransaction(); //事务开始
Cmd.Transaction = Transaction; //将Cmd指向Transaction事务
string strSQL= "insert 表1 ";
Cmd.CommandText = strSQL; //插入第一个表
Cmd.ExecuteNonQuery();
strSQL= "insert 表2 ";
Cmd.CommandText = strSQL; //插入第一个表
Cmd.ExecuteNonQuery();
Transaction.Commit(); //提交事务
}
catch (Exception e)
{
Transaction.Rollback(); //撇消事务
throw new Exception(e.Message);
}
表1 名称Bulletin,字段BulletinId(主键),Title,Content,Publisher
表2 名称ButtetinAuth,字段BulletinId(主键),UserId
怎么在一条SQL语句中想2个表中插入数据
请写具体点
2条SQL语句也可以,但要同步
create PROCEDURE [存储过程名]
(
@Title nvarchar(50),
@Content nvarchar(1000),
@Publisher nvarchar(200),
@UserID varchar(10)
)
AS
BEGIN
declare @posid int
SET NOCOUNT ON
begin transaction [事务名称]
insert into Bulletin(....) --向Bulletin表添加记录
if @@error $amp;<amp;$gt; 0=""
begin
rollback transaction [事务名称]
select N '添加失败! ' as msg
return(0)
end
set @posid = @@identity --得到BulletinId的值
insert into ButtetinAuth(....) --向ButtetinAuth表添加记录
if @@error $amp;<amp;$gt; 0=""
begin
rollback transaction [事务名称]
select N '添加失败! ' as msg
return(0)
end
commit transaction [事务名称]
select N '添加成功! ' as msg
END
(
@Title nvarchar(50),
@Content nvarchar(1000),
@Publisher nvarchar(200),
@UserID varchar(10)
)
AS
BEGIN
declare @posid int
SET NOCOUNT ON
begin transaction [事务名称]
insert into Bulletin(....) --向Bulletin表添加记录
if @@error $amp;<amp;$gt; 0=""
begin
rollback transaction [事务名称]
select N '添加失败! ' as msg
return(0)
end
set @posid = @@identity --得到BulletinId的值
insert into ButtetinAuth(....) --向ButtetinAuth表添加记录
if @@error $amp;<amp;$gt; 0=""
begin
rollback transaction [事务名称]
select N '添加失败! ' as msg
return(0)
end
commit transaction [事务名称]
select N '添加成功! ' as msg
END
guanweifeng 2014-06-23
"insert 表1;insert 表2 "这种方式是可以,但不能保证同步(如插入第一个表后就停电了,第二个表还没来得及插入,所以就不同步了),要数据同步就要用数据库事务。
private SqlConnection myConn = new SqlConnection(); //连接
private SqlTransaction Transaction = null; //事务
private SqlCommand Cmd = new SqlCommand();
假设myConn已经配置好
事务开始:
try
{
myConn.Open();
Transaction = myConn.BeginTransaction(); //事务开始
Cmd.Transaction = Transaction; //将Cmd指向Transaction事务
string strSQL= "insert 表1 ";
Cmd.CommandText = strSQL; //插入第一个表
Cmd.ExecuteNonQuery();
strSQL= "insert 表2 ";
Cmd.CommandText = strSQL; //插入第一个表
Cmd.ExecuteNonQuery();
Transaction.Commit(); //提交事务
}
catch (Exception e)
{
Transaction.Rollback(); //撇消事务
throw new Exception(e.Message);
}
SQL Server里可以使用@@identity来获取刚刚生成的那个自增长的Id
你insert A之后立刻select @a=@@identity,然后把@a插入到表B就可以了。
当然,你也可以用触发器,对A的after insert触发器,在触发器里面有inserted表,在其中可以得到刚刚插入的那一行的数据,取出来,图片ID,插入B,但问题是,你要插入B的其他数据在触发器中如何得到,因为要插入B的数据,不都在A中,因此这么做很麻烦。不如第一个方法简单。
你insert A之后立刻select @a=@@identity,然后把@a插入到表B就可以了。
当然,你也可以用触发器,对A的after insert触发器,在触发器里面有inserted表,在其中可以得到刚刚插入的那一行的数据,取出来,图片ID,插入B,但问题是,你要插入B的其他数据在触发器中如何得到,因为要插入B的数据,不都在A中,因此这么做很麻烦。不如第一个方法简单。