[英]Issue with Scope_identity() when used with TransactionScope()
我正在使用TransactionScope()这样。
SqlCommand cmd = new SqlCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "proc_insertlot"; cmd.Connection = sqlconn;
da = new SqlDataAdapter(cmd);
for (int i = 0; i < 3 i++)
{
da.Fill(ds);//this insert a row in a table which has identity column
LotId = ds.Tables[1].Rows[0][0].ToString();//always return same identityvalue
}
//-TransactionScope提交
似乎除非我提交事务,否则scope_identity不会增加。 在此示例中,scope_identity将在所有3次返回相同的值。 您如何解决这个问题?
SQL:
ALTER procedure proc_insertlot
@AuctionId int=0,
@Title varchar(300)='',
@Description varchar(4000)='',
@lottype varchar(20)='',
@ImproveBidBy varchar(20)='',
@BidDecrement varchar(20)='',
@FrontBuffer varchar(20)='',
@BackBuffer varchar(20)='',
@AttachmentId varchar(30)='',
@MkrId varchar(11)='' ,
@file_uploadlot varchar(30) =''
as
set nocount on
insert into tbl_lots(AuctionId,Title,Description,lottype,ImproveBidBy,BidDecrement,FrontBuffer,BackBuffer,AttachmentId,MkrId,MkrDt)
values (@AuctionId,@Title,@Description,@lottype,@ImproveBidBy,@BidDecrement,@FrontBuffer,@BackBuffer,@AttachmentId,@MkrId,GETDATE())
select @@Identity as lotid
我认为它将起作用。 更改行[0] [0]->行[i] [0]
for (int i = 0; i < 3 i++)
{
da.Fill(ds);//this insert a row in a table which has identity column
LotId = ds.Tables[1].Rows[i][0].ToString();//will now return required identityvalue
}
看看它是否有效。
更新资料
有你的问题。 问题是LotId = ds.Tables[1].Rows[0][0].ToString();
一旦提交作用域,它将始终返回scope_identity
的最后一个值。 相反,您可以尝试@@Identity
。 还要检查是否已启用PK的自动增量功能。 通常,我们将自动增量列用作PK。
例如:Courtsey:Guffa。
create procedure proc_insertlot
as
set nocount on
declare @id as int
insert into SomeTable (
SomeField
) values (
42
)
SET @Id=@@Identity
SELECT @ID
为此,您需要:
set nocount on
以抑制插入结果 例:
create procedure proc_insertlot
as
set nocount on
insert into SomeTable (
SomeField
) values (
42
)
select scope_identity()
ExecuteScalar用于最后插入记录的返回ID,您可以使用此函数返回ID
select Scope_Identity
也许这可以帮助您解决问题。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.